2014-09-25 72 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用戶不會導致我打開它,因此在這樣的警告中是否有價值是有爭議的。很難知道它可能會導致錯誤被避免的頻率,而不是多久它會從更重要的警告或實際編碼中移除注意力,從而導致更多的錯誤!

相關問題