这个关键字在initilizer中用于歧义解决

时间:2016-03-12 13:13:14

标签: c++ initialization this

我遇到了使用与以下名称相同的参数初始化成员数据的方法:

class T {
    int x;
public:
    T(int x) : x(x) {}   // assign parameter x to T::x
};

工作得很好。但是当我尝试使用 this 关键字显式初始化时, 发生了错误。

    T(int x) : this->x (x) {}   // error

有人可以解释错误的原因吗?

3 个答案:

答案 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;
    }
};