2014-12-02 114 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