【发布时间】:2020-02-19 21:19:26
【问题描述】:
我想检查一下我是否正确理解了以下来自 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' );
}
【问题讨论】:
标签: c++ namespaces definition c++20