为什么合法的不当访问士兵在显式实例?(Why is it legal to inappropriat

2019-07-31 03:11发布

究竟为什么会这样被允许:

//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
template<typename T>
struct invisible
{
    static typename T::type value;
};

template<typename T>
typename T::type invisible<T>::value;

//////////////////////////////////////////////////////////////////////////
template<typename T, typename T::type P>
class construct_invisible
{
    construct_invisible(){ invisible<T>::value = P; }
    static const construct_invisible instance;
};

template<typename T, typename T::type P>
const construct_invisible<T, P> construct_invisible<T, P>::instance;

//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
class A
{
public:
    A(int x) : m_X(x){}
private:
    int m_X;
};

//////////////////////////////////////////////////////////////////////////
struct A_x{ typedef int A::*type; };
template class construct_invisible<A_x, &A::m_X>;// <---- WHY DOES `&A::m_X` WORK HERE?

//////////////////////////////////////////////////////////////////////////
int main()
{
    A a(17);
    std::cout << a.*invisible<A_x>::value << '\n';
}

幸得约翰内斯·绍布对于上述C ++滥用。 ( 演示 )

您可以访问哪些应该是不可见的,你还有其他的情况? 这只是在标准的一个“错误”?

Answer 1:

它是使具有私有成员的类的作者可以显式实例该成员或者其作为参数传递,你只是做。

编译器不知道是谁在键盘的前面,所以访问检查这里是相当保守的。

显式初始化中的参数得到特殊的待遇,因为没有机制的一类作家显式实例化一个模板在允许的范围内或以某种方式允许与朋友的声明这样做。



文章来源: Why is it legal to inappropriately access privates in an explicit instantiation?