根据 c++ 标准,这是格式错误还是格式正确?
namespace M { struct i {}; }
namespace N { static int i = 1; }
using M::i;
using N::i;
int main() { sizeof (i); }
Clang 拒绝它,而 GCC 接受它。
根据 [namespace.udir-6] ( http://eel.is/c++draft/basic.namespace#namespace.udir-6 ):
如果名称查找在两个不同的命名空间中找到一个名称的声明,并且这些声明没有声明相同的实体并且没有声明函数,则该名称的使用是错误的。
我们应该如何解释这一点?请记住,每个 using-declaration 都通过 [namespace.udecl]p1 ( http://eel.is/c++draft/namespace.udecl#1 ) 声明一个名称:
using-declaration 将名称引入到 using-declaration 出现的声明性区域中。
using-declaration :
using typename
opt 嵌套名称说明符 unqualified-id;
在 using-declaration 中指定的成员名称在 using-declaration 出现的声明区域中声明。[注:只有指定的名称是这样声明的;在 using-declaration 中指定枚举名称不会在 using-declaration 的声明区域中声明其枚举数。— 结束注释] 如果 using 声明命名了一个构造函数([class.qual]),它会在出现 using 声明的类([class.inhctor])中隐式声明一组构造函数;否则,在 using-declaration 中指定的名称是另一个命名空间或类中的一组声明的同义词。
所以我们有 4 个名称 i 的声明。
不合格的名称查找i
在其中sizeof(i)
找到哪些?
它是否只找到using M::i;
和using N::i;
哪些都在同一个命名空间(全局命名空间)中,所以程序格式正确?
或者它是否只找到struct i {};
并且static int i = 1;
哪些位于不同的名称空间中,因此程序格式错误?
还是我们有其他选择?