2015-08-26 10 views
10

實施例:成員聲明`decltype(name)name;`允許在本地結構中第一個名稱引用封閉範圍?

int main() 
{ 
    int a = 0; 
    struct X 
    { 
     decltype(a) a; 
    }; 
    return 0; 
} 

decltype(a)main本地a,而構件它聲明共享相同的名稱。

Clang編譯沒有任何問題,MSVC14也是如此。

G++抱怨它,加入-fpermissive使得它傳遞雖然

prog.cc:6:21: error: declaration of 'int main()::X::a' [-fpermissive] 
     decltype(a) a; 
        ^
prog.cc:3:9: error: changes meaning of 'a' from 'int a' [-fpermissive] 
    int a = 0; 

哪些行爲是符合標準的?

+0

你爲什麼要那樣做? –

+1

這是不合格的,不需要診斷。 –

+1

@ JohannesSchaub-litb ouch,有沒有理由呢? –

回答

8

相信這違反[basic.scope.class]/1(N3337):

下列規則描述在類聲明的名稱的範圍。

1)[...]

2)中的一類S使用應指在其上下文相同的聲明和當A名稱NS完成的範圍重新評估。違反此規則不需要診斷。

由於decltype(a)指的是在部件變量聲明之前封閉範圍的聲明,而是指X時「在已完成的範圍重新評估」的構件,是形成不良的節目。不需要診斷,但是GCC提供了一個診斷(儘管它相當神祕)。所有三種編譯器的行爲都是有效的。