此关键字在启动器中用于解决歧义

this keyword in initilizer for ambiguity resolution

本文关键字:用于 解决 歧义 关键字 启动      更新时间:2023-10-16

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

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

它工作正常。但是当我尝试使用此关键字显式初始化时,发生错误。

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

谁能解释错误的原因?

根据成员初始值设定项列表的语法,这里期望的是标识符,而this->x不是。

类或标识符 ( 表达式列表(可选) )
类或标识符 - 任何标识符、类名或 decltype 表达式,用于命名非静态数据成员、直接或虚拟基,或(用于委托构造函数)类本身

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

要初始化的成员已被放置在初始值设定项列表中以消除歧义。尝试使用 this 来引用成员是一个错误。用于构造成员的值同样不明确,因为不能从自身构造成员。这就是为什么允许您对成员和构造函数参数使用相同的名称。

不能以这种方式使用初始化列表。如果你想要等效的行为,你必须把赋值放在定义中。

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