2014-12-02 195 views
3

如果允許我在想:內嵌命名空間和ambigous聲明

namespace A { 
    inline namespace B { 
    int a; 
    } 
    int a; 
} 

void foo() { 
    A::a = 0; // clang 3.4 compiles, but gcc doesn't 
} 

標準說,這

最後,通過明確 資格封閉命名空間查找一個名稱(3.4 .3.2)將包含由using-directive引入的內聯名稱空間 的成員,即使在封閉名稱空間中有名稱爲 的聲明。

但我不明白。

+1

'gcc 4.9'和'clang 3.5'都不允許這個代碼,你可以嘗試[wandbox](http://melpon.org/wandbox/)...'鐺3.4'雖然,看起來像一個bug – 2014-12-02 15:12:54

+0

@ShafikYaghmour謝謝你,沙菲克。這是很好的資源。是的,我在我的工作中嘗試了這個代碼,在這裏我有clang-3.4 – Bikineev 2014-12-02 15:18:12

回答

5

看起來這是一個pre clang 3.5 bug並且在這個812861上有兩個缺陷報告。的分辨率在861和添加了以下到3.4.3.2[namespace.qual]重點礦山前進):

對於命名空間X和名稱m時,名稱空間限定查找集合S(X ,m)的定義如下:令S'(X,m)爲X中所有m的聲明和X的內聯命名空間集合(7.3.1 [namespace.def])的集合。如果S'(X,m)不是空的,則S(X,m)是S'(X,m)。否則,S(X,m)是S(Ni,m)的並集,用於所有非內聯命名空間Ni,由X中的using指令及其內聯名稱空間集合提名。

和也是相關的加法:

如果S(X,m)是空集,是形成不良的節目。否則,如果S(X,m)恰好有一個成員,或者引用的上下文是使用聲明(7.3.3 [namespace.udecl]),則S(X,m)是米否則,如果使用m不是允許從S(X,m)中選擇唯一聲明的程序,則該程序不合格。

它看起來像的溶液中加入預C++ 11的變化,本文中存在N3337