我遇到了使用与以下名称相同的参数初始化成员数据的方法:
class T {
int x;
public:
T(int x) : x(x) {} // assign parameter x to T::x
};
工作得很好。但是当我尝试使用 this 关键字显式初始化时, 发生了错误。
T(int x) : this->x (x) {} // error
有人可以解释错误的原因吗?
答案 0 :(得分:4)
根据member initializer list的语法,此处预期的是标识符,而$csrf_token
则不是。
class-or-identifier(表达式列表(可选))
class-or-identifier - 用于命名非静态数据成员,直接或虚拟基础或(用于委派构造函数)类本身的任何标识符,类名或decltype表达式
正如上面显示的可能的标识符一样,this->x
很好,没有歧义,根本不需要使用x(x)
。
答案 1 :(得分:1)
要初始化的成员已被置于初始化列表中,因此已消除歧义。尝试使用this
来引用该成员是一个错误。构造成员的值同样不含糊,因为您无法从自身构造成员。这就是为什么允许您为成员和构造函数参数使用相同的名称。
答案 2 :(得分:0)
您不能以这种方式使用初始化列表。如果您想要等效行为,则必须将赋值放在定义中。
class T {
int x;
public:
T(int x) {
this->x = x;
}
};