gpt4 book ai didi

c++ - 使用相同的参数名称和成员名称是否有效

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:59:39 24 4
gpt4 key购买 nike

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

struct Struct {
Struct(const T& value) : value(value) {}
T value;
};

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

最佳答案

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

那么为什么这样做有效呢?如果我们考虑您的构造函数:

Struct(const T& value) : value(value) {}
^ ^
1 2

12 在不同的范围内进行评估。所以我们需要看看draft C++ standard 12.6.2 部分 初始化基和成员 并查看一些语法:

ctor-initializer:
: mem-initializer-list
mem-initializer-list:
mem-initializer ...opt
mem-initializer , mem-initializer-list ...opt
mem-initializer:
mem-initializer-id ( expression-listopt )
mem-initializer-id braced-init-list

消化后我们看到 1 实际上是一个 mem-initializer-id2 是一个 expression-listopt 我们可以分别转到 212 段。第 2 段说:

In a mem-initializer-id an initial unqualified identifier is looked up in the scope of the constructor’s class and, if not found in that scope, it is looked up in the scope containing the constructor’s definition. [...]

所以 1 将首先在类中查找,而我们可以从段落 12 中看到它说:

Names in the expression-list or braced-init-list of a mem-initializer are evaluated in the scope of the constructor for which the mem-initializer is specified.

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

关于c++ - 使用相同的参数名称和成员名称是否有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20615156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com