【发布时间】:2019-08-20 00:23:30
【问题描述】:
我最近开始使用“警告级别 4”,并在使用 C++ 编码时将警告视为错误。我想要一些关于以下 sn-p 的更深入的信息:
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 收到以下警告/错误:
错误:C2220 - 警告被视为错误 - 未生成“对象”文件。
警告:C4458 - 'size' 的声明隐藏了类成员。
警告表明size 成员被方法的参数隐藏,该参数也名为size。输出表明错误不是来自构造函数,而是来自func 方法。我觉得这很令人困惑,因为构造函数似乎没有这个问题(实际上,删除 func 允许 sn-p 编译)。
降低警告级别允许应用程序编译,它似乎按预期工作。使用初始化列表而不是构造函数的主体(参见注释行)似乎也可以,但我猜这是由于初始化列表语义。
我知道错误表明func 的size 参数名称与Foo 的同名成员冲突,但this 关键字不应该解决这种混淆吗?这只是微软的编译器过于严格吗?
【问题讨论】:
-
在构造函数的成员初始化列表中,
:size{ size }上没有警告,因为size是哪个没有歧义。左边的size必须是类成员,右边的size必须是输入参数。在没有显式使用this->的方法中,情况并非如此。
标签: c++ visual-c++ this compiler-warnings shadowing