我想检查自己是否正确理解以下引用的C++ 20标准(英语不是我的母语)。
第9.7.1节名称空间定义:
2在命名名称空间定义中,标识符是命名空间的名称。如果当查找标识符(6.4.1)时,引用的名称空间名称(但不是名称空间别名)是在命名名称空间定义出现的名称空间中引入的,或者是在名称空间内联命名空间集合的成员中引入的,则命名空间定义扩展了先前声明的命名空间。否则,标识符将作为命名空间名称引入到出现命名名称空间定义的声明性区域中。
也就是说,是否可以在名称空间中定义名称空间,然后在其内联名称空间中进行扩展?反之亦然。名称空间是否可以在内联名称空间中定义,然后在其封闭的名称空间中进行扩展?
这是一个演示程序。
#include <iostream>
inline namespace N1
{
inline namespace N2
{
namespace N3
{
void f( int ) { std::cout << "f( int )\n"; }
}
}
namespace N3
{
void f( char ) { std::cout << "f( char )\n"; }
}
}
int main()
{
N3::f( 10 );
N3::f( 'A' );
}程序输出是
f( int )
f( char )但是,对于这个程序,编译器会发出一个错误,说明对'N3‘的引用是不明确的。
#include <iostream>
inline namespace N1
{
namespace N3
{
void f( int ) { std::cout << "f( int )\n"; }
}
inline namespace N2
{
namespace N3
{
void f( char ) { std::cout << "f( char )\n"; }
}
}
}
int main()
{
N3::f( 10 );
N3::f( 'A' );
}发布于 2019-10-23 15:46:53
名称空间是否可以在名称空间中定义,然后在其内联名称空间中进行扩展?
不是的。在第二个示例中,当编译器看到N3在N2中的定义时,N3的查找会找到在N2之外声明的N3,但是N3不是“在命名空间定义出现的名称空间中引入的”(因为它不在N2中),或者“在该名称空间的内联命名空间集的成员中引入的”,因为N2的内联命名空间集是N2内的过渡性不行命名空间集合。因此,N3的这个新定义没有扩展前一个定义。
名称空间是否可以在内联名称空间中定义,然后在其封闭的名称空间中进行扩展?
是。在第一个示例中,N3在查找时会发现“在内联命名空间集的成员中引入”N2::N3,因为N2是N1内联命名空间集的一部分。
我们可以理解这种明显不对称的原因如下:在第二个示例中,当最初定义N3时,它被定义为N1的成员,而不是任何内联N1名称空间的成员。稍后,在定义N2::N3时,如果要扩展N1::N3,则是N2::N3使N3成为N2的成员,这违背了常识,因此是不允许的。在第一个示例中,N3最初被定义为内联命名空间N2的成员,以后再用第二个定义对其进行扩展没有问题。(虽然我看不出有一个明显的理由可以解释这是有用的。)
https://stackoverflow.com/questions/58526031
复制相似问题