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中工作,但仍然可能依赖于编译器)(预期的问题:为什么需要这个?答案:宏制作目的)
这确实是有效的代码,就像其他答案一样,我会警告您,应该非常小心地使用它,因为它可能会令人困惑,并且可能会导致代码难以维护。
\n\n那么为什么这会起作用呢?如果我们考虑你的构造函数:
\n\nStruct(const T& value) : value(value) {}\n ^ ^\n 1 2 \nRun Code Online (Sandbox Code Playgroud)\n\n1并2在不同的范围内进行评估。所以我们需要看一下C++标准草案的Initializing 12.6.2 bases and Members,看看一些语法:
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\nRun Code Online (Sandbox Code Playgroud)\n\n消化完之后,我们发现它1实际上是一个mem-initializer-id和2一个expression-listopt,我们可以分别转到第 2段和第 12段。第2段说:
\n\n\n在 mem-initializer-id 中,在 constructor\xe2\x80\x99s 类的范围内查找初始非限定标识符,如果在该范围内找不到,则在包含 constructor\xe2\x80 的范围中查找它\x99s 的定义。[...]
\n
所以1首先会在课堂上查找,我们可以从第 12段看到:
\n\n\nmem-initializer 的表达式列表或花括号初始化列表中的名称在指定 mem-initializer 的构造函数的范围内进行计算。
\n
2将在构造函数的范围内查找。所以1会先找到成员变量并停止查找,而2会在构造函数中查找并找到参数。这也意味着,如果您想引用表达式列表中的成员变量,则必须使用this->。
| 归档时间: |
|
| 查看次数: |
237 次 |
| 最近记录: |