2016-01-17 52 views
1

我注意到下面的代碼與最近的編譯器編譯:結構名稱不遮蔽變量名

int main() 
{ 
    int x; 
    struct x; 
    x = 210;     // ← 
} 

我記得它沒有編譯若干年前。

是否在C++ 11或C++ 14中更改了查找規則以使此代碼「工作」(因此打破了使用struct variable_name;作爲確保在以下代碼中不使用該變量的方法)?


更新: 顯然我記得正確。我已經驗證,即使用Visual C++ 2010.然而編譯行的代碼,用於參數時struct名稱是在內部範圍和陰影,就像在此代碼:

void foo(int x) 
{ 
    struct x; 
    x = 210;     // ← Error 
} 

int main() 
{ 
} 

因此我已經選擇作爲「解決方案」答案是沒有變化;規則總是這樣。

+0

AFAIK變量名稱和類標記具有不同的作用域,因此可以位於相同的命名空間 –

+0

@AngelusMortis:是的,問題涉及上一條語句中的賦值。感謝您指出模糊性。定影。 –

+1

_「我記得幾年前沒有編譯過。」_你能給我們一些可以檢查的具體例子嗎?編譯器版本和標誌?我不同意你的回憶。 –

回答

8

[basic.scope.hiding]/2類名(9.1)或枚舉名稱(7.2)可通過可變的以相同的聲明的名稱,數據成員,函數,或枚舉被隱藏範圍。如果類或枚舉名稱和變量,數據成員,函數或枚舉器在同一個作用域(以任何順序)中聲明具有相同的名稱,則該類或枚舉名稱在變量,數據成員,函數或枚舉器名稱是可見的。

此語言自C++ 98以來一直存在。如果你看過一個工作方式不同的編譯器,那麼編譯器就是標準的,或者只是簡單的bug。

0

你所做的是struct x的前向聲明。您沒有聲明並且新變量名爲x。例如:

struct foo; 
int foo; 
struct foo { 
    int foo; 
}; 
struct foo thisisfoovariable; 

以上是隻有兩個變量的聲明:foo和thisisfoovariable,其類型爲struct foo(類型int的)。