下面给定的代码编译成功:
template <typename T, T nontype_param>
class C;
class X {
public:
int n;
};
int main()
{
C<int X::*, &X::n>* c; //Here
return 1;
}
Scope 解析运算符如何在这里工作而不是. operator
? 我们是否允许访问这样的非静态成员?
参考:C++ 模板完整指南,第 8.3.3 节非类型参数
下面给定的代码编译成功:
template <typename T, T nontype_param>
class C;
class X {
public:
int n;
};
int main()
{
C<int X::*, &X::n>* c; //Here
return 1;
}
Scope 解析运算符如何在这里工作而不是. operator
? 我们是否允许访问这样的非静态成员?
参考:C++ 模板完整指南,第 8.3.3 节非类型参数
是的,这段代码是有效的,而且您的混淆来源实际上与模板无关。
int X::*
是一个指向成员的指针(特别是指向int
type 上的数据成员的指针X
)。指针本身并不传递对象的实例,因此您确实可以将指针指向非静态成员。(事实上,指向静态成员的指针只是普通指针,而不是指向成员的指针!)
您在使用指针时提供对象实例,而不是在获取指针时提供。
// Declare a pointer to a data member of type int on object of type X, and
// initialize it to point to the X::n member.
int X::*ptr = &X::n;
// *ptr is not valid on member pointers. Rather, we need to supply an instance:
X instance;
// Then use the member pointer dereference operator .*
(instance.*ptr) = 5; // Same as "instance.n = 5;" in this case.