【发布时间】:2015-10-21 01:37:21
【问题描述】:
根据 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 typenameoptnested-name-specifier unqualified-id;在 using 声明中指定的成员名称在 使用声明出现的声明区域。 [ 笔记: 只有指定的名称是这样声明的;指定枚举名称 在 using-declaration 中没有在 using-declaration 的声明区域。 — 尾注] 如果一个 using-declaration 命名一个构造函数([class.qual]),它隐式地 在类中声明一组构造函数 using-declaration 出现 ([class.inhctor]);否则名称 在使用声明中指定的是一组的同义词 另一个命名空间或类中的声明。
所以我们有 4 个名称 i 的声明。
i 在sizeof(i) 中的非限定名称查找会找到哪些?
它是否只发现using M::i; 和using N::i; 都在同一个命名空间(全局命名空间)中,所以程序是格式正确的?
或者它只找到位于不同命名空间中的struct i {}; 和static int i = 1;,因此程序格式错误?
或者我们还有其他选择吗?
【问题讨论】:
-
我确定我最近看到了一个关于此的问题,得出的结论是存在错误。你搜索过吗?
-
问题不完全相同。这是一个后续问题。
-
@LightnessRacesinOrbit 哦,好的。我没有想到。感谢您指出。
标签: c++ language-lawyer name-lookup using-declaration name-hiding