gpt4 book ai didi

c++ - 为什么在显式实例化中不恰本地访问私有(private)对象是合法的?

转载 作者:可可西里 更新时间:2023-11-01 15:24:57 25 4
gpt4 key购买 nike

为什么这会被允许:

//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
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';
}

归功于 Johannes Schaub对于上述 C++ 滥用。 ( Demo )

在其他情况下您可以访问您不可见的内容吗?这只是标准中的“错误”吗?

最佳答案

这样一来,拥有私有(private)成员的类的作者就可以显式实例化该成员,或者像您刚才那样将其作为参数传递。

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

显式实例化中使用的参数得到特殊处理,因为类作者没有机制在允许的上下文中显式实例化模板或以某种方式允许使用友元声明这样做。

关于c++ - 为什么在显式实例化中不恰本地访问私有(private)对象是合法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12048193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com