使用相同的参数名称和成员名称有效

Vik*_*ehr 5 c++ variables constructor argument-passing language-lawyer

这是有效的C++,假设我想将参数变量复制到成员变量:

struct Struct {
  Struct(const T& value) : value(value) {}
  T value;
};
Run Code Online (Sandbox Code Playgroud)

(更新:它在Visual Studio中工作,但仍然可能依赖于编译器)(预期的问题:为什么需要这个?答案:宏制作目的)

Sha*_*our 4

这确实是有效的代码,就像其他答案一样,我会警告您,应该非常小心地使用它,因为它可能会令人困惑,并且可能会导致代码难以维护。

\n\n

那么为什么这会起作用呢?如果我们考虑你的构造函数:

\n\n
Struct(const T& value) : value(value) {}\n                         ^     ^\n                         1     2    \n
Run Code Online (Sandbox Code Playgroud)\n\n

12在不同的范围内进行评估。所以我们需要看一下C++标准草案的Initializing 12.6.2 bases and Members,看看一些语法:

\n\n
ctor-initializer:\n    : mem-initializer-list \nmem-initializer-list:\n    mem-initializer ...opt\n    mem-initializer , mem-initializer-list ...opt\nmem-initializer:\n    mem-initializer-id ( expression-listopt )\n    mem-initializer-id braced-init-list\n
Run Code Online (Sandbox Code Playgroud)\n\n

消化完之后,我们发现它1实际上是一个mem-initializer-id2一个expression-listopt,我们可以分别转到第 2段和第 12段。第2段说:

\n\n
\n

在 mem-initializer-id 中,在 constructor\xe2\x80\x99s 类的范围内查找初始非限定标识符,如果在该范围内找不到,则在包含 constructor\xe2\x80 的范围中查找它\x99s 的定义。[...]

\n
\n\n

所以1首先会在课堂上查找,我们可以从第 12段看到:

\n\n
\n

mem-initializer 的表达式列表或花括号初始化列表中的名称在指定 mem-initializer 的构造函数的范围内进行计算。

\n
\n\n

2将在构造函数的范围内查找。所以1会先找到成员变量并停止查找,而2会在构造函数中查找并找到参数。这也意味着,如果您想引用表达式列表中的成员变量,则必须使用this->

\n