C++:即使使用 "this" 关键字,参数声明也会隐藏 class 成员

C++: Declaration of parameter hides class member even with "this" keyword

我最近开始使用“警告级别 4”并在使用 C++ 编码时将警告视为错误。我想要关于以下片段的更深入的信息:

struct Foo
{
    Foo(int size)
        //:size{ size } // <- More on this later.
    {
        this->size = size;
    }

    void func(int size)
    {
        this->size = size;
    }

    int size;
};

int main()
{
    Foo a{ 1 };
    a.func(2);
}

所以,我从 Visual Studio 2019 年得到以下 warning/error:

Error: C2220 - Warning treated as error - no 'object' file generated.

Warning: C4458 - Declaration of 'size' hides class member.

该警告表明 size 成员被方法的参数隐藏,该方法的参数也被命名为 size。输出表明错误不是来自构造函数,而是来自 func 方法。我觉得这很混乱,因为构造函数似乎没有这个问题(实际上,删除 func 允许代码片段编译)。

降低警告级别允许应用程序编译,它似乎按预期工作。使用初始化列表而不是构造函数的主体(参见注释行)似乎也有效,但我猜这是由于初始化列表语义所致。

我理解错误说 funcsize 参数名称与 Foo 的同名成员冲突,但 [=20= 不应该] 关键字解决了这个困惑?是不是微软的编译器太严格了?

在这个级别,这些警告是关于设置最佳实践的。确保您的成员变量名称与函数参数变量名称不同是使您的代码更具可读性的好习惯。虽然 "this->size" 确实消除了歧义,但这也意味着当您在该函数中搜索 size 的用途时,您必须检查您指的是哪个变量。使名称不同可以消除 2 个月后修复错误时的歧义 :) 推荐的修复方法包括将成员变量更改为具有前缀,例如 m_size,这也有利于改进 auto-complete/intellisense,或更改参数名称。

我会将警告视为错误,我强烈建议您遵守 W4。很高兴你照顾好你的代码:)

but shouldn't the this keyword fix that confusion?

并不是编译器对 this->sizesize 的不同感到困惑。即使删除该行,您也很可能会收到警告。编译器警告您函数的参数名称隐藏了成员名称。