2014-09-25 100 views
1

考虑下面的代码:为什么铿锵声不会对阴影产生警告?

class A { 
    A(int x) { 
    y_ = x; 
    } 
    void x() { 
    } 
    int y_; 
}; 
int main() { 
} 

如果我在使用-Weverything它不会产生任何警告的最新用铿锵编译。但如果我用g ++编译它,会生成

x.cpp: In constructor ‘A::A(int)’: 
x.cpp:2:12: warning: declaration of ‘x’ shadows a member of 'this' [-Wshadow] 
    A(int x) { 
     ^

为什么这两个产生不同的警告?谁是对的?它是错误吗?

回答

2

为什么他们不应该产生不同的警告?两者都不是“正确的”。标准并没有强制要求这样的警告,所以完全取决于编译器编写人员来决定他们认为用户可能会发现警告有用的内容。

请注意,任何关于使用哪个x的混淆都可能导致尝试“调用”变量(这可能对函子有意义)或者分配给函数或从函数读取...... many(但不是全部),这样的意外用户无论如何都是彻头彻尾的编译错误。对于很多人(包括我)命名约定ala member_variable_删除参数与成员变量冲突的可能性。

我从来没有想过这样的警告,并且知道GCC提供了一个,并且作为一个频繁和快乐的GCC用户不会导致我打开它,因此在这样的警告中是否有价值是有争议的。很难知道它可能会导致错误被避免的频率,而不是多久它会从更重要的警告或实际编码中移除注意力,从而导致更多的错误!