初始化器中的 this 关键字用于歧义解决

this keyword in initilizer for ambiguity resolution

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

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

它运行良好。但是当我尝试使用 this 关键字显式初始化时, 发生错误。

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

谁能解释错误的原因?

根据member initializer list的语法,这里应该是标识符,而this->x不是。

class-or-identifier ( expression-list(optional) )
class-or-identifier - any identifier, class name, or decltype expression that names a non-static data member, a direct or virtual base, or (for delegating constructors) the class itself

如上所示可能的标识符,x(x)很好,没有歧义,根本不需要使用this->

你不能那样使用初始化列表。如果您想要等效的行为,则必须将赋值放在定义中。

class T {
    int x;
public:
    T(int x) {
        this->x = x;
    }
};

要初始化的成员已被放入初始化列表中,因此已消除歧义。尝试使用 this 来引用成员是错误的。用于构造成员的值同样没有歧义,因为您不能从自身构造成员。这就是允许您对成员和构造函数参数使用相同名称的原因。