我编写了以下代码:
#include <iostream>
inline namespace M
{
int j=42;
}
int main(){ std::cout << j << "\n"; } //j is unqualified name here.
//Hence, unqualified name lookup rules will be applied.
//This implies that member of inline namespace shall not be considered.
//But it is not true而且效果很好。但我认为这个计划是错误的。这是因为标准说(N3797,sec )。7.3.1/7):
最后,通过显式限定 (3.4.3.2)在封闭名称空间中查找名称,将包含使用指令引入的内联名称空间的成员,即使在封闭名称空间中有该名称的声明。
此外,第3.4.1/6节没有提到在非限定名称查找中涉及内联名称空间的任何内容:
在函数声明器之后的函数定义中使用的名称-id 28是命名空间N的成员(其中,仅为公开目的,N可以表示全局范围)应在其在所使用的块中或在其一个封闭块(6.3)中使用之前声明,或在其在名称空间N中使用之前声明,如果N是嵌套的名称空间,则应在N的一个封闭命名空间中使用它之前声明其名称空间。
这是一个g++错误,还是我不正确地理解规则?
发布于 2014-06-15 12:05:54
没有虫子..。
不,它不是g++ (或clang++)中的一个bug,它具有所描述的行为,编译器应该找到j。
inline namespace N {
int j;
}
int main () {
int a = j; // legal, `j` == `N::j`
}标准怎么说?
您缺少了标准的一个非常重要的部分,即7.3.1§8,其中声明内联名称空间的封闭名称空间隐式地有一个使用指令,该指令引用内联命名空间。
[7.3.1]p8命名空间定义[namespace.def]内联命名空间的成员可以在大多数方面使用,因为他们认为自己是封闭名称空间的成员。具体来说,内联名称空间及其包围的命名空间都会添加到参数依赖查找(3.4.2)中使用的一组关联名称空间中,并且a (7.3.4)将内联名称空间的名称隐式插入到封闭名称空间中,作为未命名的名称空间(7.3.1.1)。
精化
这意味着前面的示例在语义上等同于以下内容,其中我们引入了一个使用指令,将嵌套命名空间中的名称带入全局命名空间:
inline namespace N {
int j;
}
using namespace N; // the implicit using-directive
int main () {
int a = j; // legal
}https://stackoverflow.com/questions/24228299
复制相似问题