内联命名空间和不明确的声明
Inline namespaces and ambigous declarations
我想知道这是否被允许:
namespace A {
inline namespace B {
int a;
}
int a;
}
void foo() {
A::a = 0; // clang 3.4 compiles, but gcc doesn't
}
标准说,
最后,通过显式在封闭命名空间中查找名称 限定 (3.4.3.2( 将包括内联命名空间的成员 由 using-指令引入,即使有声明 封闭命名空间中的该名称。
但我不明白。
看起来这是一个 pre clang 3.5 错误,并且有两个关于此 812 和 861 的缺陷报告。分辨率在 861 中,并在 [namespace.qual] 3.4.3.2
中添加以下内容(强调我的(:
对于命名空间 X 和名称 m,命名空间限定的查找集 S(X,m( 定义如下:设 S'(X,m( 是 X 中 m 的所有声明和 X 的内联命名空间集的集合 (7.3.1 [namespace.def](。如果 S'(X,m( 不为空,则 S(X,m( 为 S'(X,m(;否则,S(X,m( 是 S(Ni,m( 的并集,用于所有非内联命名空间 Ni,由 X 中的 using 指令及其内联命名空间集指定。
以及相关的补充:
如果 S(X,m( 是空集,则程序格式不正确。否则,如果 S(X,m( 只有一个成员,或者引用的上下文是 using-声明 (7.3.3 [namespace.udecl](,则 S(X,m( 是 m 所需的声明集。否则,如果使用 m 不允许从 S(X,m( 中选择唯一声明,则程序格式不正确。
看起来更改是在 C++11 之前添加的,此文本存在于 N3337 中。
相关文章:
- Visual C++(VS2017)中用户定义的转换不明确
- 重载类方法的不明确调用
- 为函数定义符号不明确的指针参数
- 父类的私有函数会导致对具有相同名称和相似参数的子类中的公共函数的不明确调用
- 在 C++17 中的命名空间和子命名空间中重载运算符是不明确的
- 为什么转换函数声明不需要至少一个定义类型说明符
- C++ 编译器错误:P1LinkedList.cpp:145:错误:重载的"to_string(int&)"调用不明确
- 对重载函数find_first_not_of的不明确调用
- 不明确的成员模板查找
- gcc出现不明确的模板实例化错误
- 调用'Node'构造函数是不明确的
- 如何解决不明确的运算符过载问题?
- 为什么别名声明不是有效的 init 语句(/simple-declaration)?
- C++ 类型类的变量声明不命名类型?
- 使用 nullptr 调用重载方法是不明确的
- 简化在 Pybind11 中为 C++ 模板类生成包装类:模板声明不能出现在块范围内
- 尽管显式声明了返回类型,但对lambda的调用是不明确的
- 不明确的函数声明
- 循环依赖(类对类型定义,类型定义对类),前向声明给出不明确的调用
- 内联命名空间和不明确的声明