簡體   English   中英

typedef並在同一范圍內使用相同名稱的聲明

[英]typedef and using declaration for same name at same scope

我仔細研究了C ++ 11標准(以及n3242草案)和互聯網,但未找到准確的答案。 下面的代碼使用clang 3.2和g ++ 4.7.2以及Visual Studio 2010進行編譯,但我希望會收到錯誤。

#include <iostream>
#include <typeinfo>


typedef int a_t;


namespace a_ns
{
class a_t {};
}


using a_ns::a_t;


int main()
{
    a_t a;
    std::cout << typeid(a).name() << std::endl;
    return 0;
}

內置:

clang -std=c++11 -pedantic -Wall -o a a.cpp -lstdc++
g++ -std=c++11 -pedantic -Wall -o a a.cpp -lstdc++
cl -EHsc -GR a.cpp

is of type int and the typedef prevailed. clang和g ++生成的可執行文件打印“i”,這似乎表明是int類型而typedef占了上風。 cl生成的可執行文件打印“class a_ns :: a_t”,這似乎表明Visual Studio更喜歡使用聲明。

我希望代碼不要按照以下標准摘錄編譯。 我希望類似於“使用聲明的目標與已經在范圍內的聲明沖突”的錯誤。

7.1.3.6類似地,在給定的范圍內,類或枚舉不應聲明與在該范圍內聲明的typedef-name具有相同的名稱,並且引用除類或枚舉本身以外的類型。

7.3.3.1 using聲明在聲明區域中引入了一個名稱,其中出現using聲明。

7.3.3.2每份使用聲明均為聲明[...]

標准中可能缺少一些可以解釋這種行為的東西(或者我太累了,看不到這種行為),但我似乎無法找到它。

謝謝。

這是正確的,你所顯示的內容使代碼無效。 還有3.3.1p4也使它無效(見7.3.3p13)。

對於現實測試,我使用ICC進行測試,並按預期拒絕它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM