名称查找歧义不一致
Name-lookup ambiguity inconsistency
我试图理解为什么这个程序没有为I提供名称查找歧义:
namespace X { int i = 1; }
namespace Q {
namespace P {
int i = 2;
using namespace X;
}
using namespace P;
int l = i;
}
int main() {}
如果我们像这样修改它,我们会得到一个名称查找歧义:
namespace X { int i = 1; }
namespace P {
int i = 2;
using namespace X;
}
using namespace P;
int l = i;
int main() {}
我在这里做的唯一更改是删除了名称空间Q,并将其内容放在全局名称空间中。
我已经尝试了3种不同的编译器:
- GCC和Clang with http://melpon.org/wandbox visual c++ with http://webcompiler.cloudapp.net/
都给出了这封邮件中所述的结果,我正试图找出原因。
有人能用c++标准来解释这种行为吗?我不明白。
在第一个程序中,变量i
被定义在命名空间p中,因为using指令
using namespace X;
将X的声明放在全局命名空间(X和p的通用命名空间)中。因此,在p中声明i
(由于另一个using指令,更准确地说在Q中)隐藏了在全局命名空间中声明X::i
。
来自c++标准(3.4.1非限定名查找)
2由using指令指定的命名空间中的声明在包含using-directive的命名空间中可见;看到7.3.4 .
第一个程序是
namespace X { int i = 1; }
namespace Q {
namespace P {
int i = 2;
using namespace X; // 1
}
using namespace P; // 2
int l = i;
}
使用指令#1的封闭命名空间是全局命名空间,使用指令#2的封闭命名空间是命名空间q。
在第二个程序中,i
的两个定义都被放置在全局命名空间中,因为这两个using指令
//...
using namespace X;
//...
using namespace P;
相关文章:
- 大于65535的C++数组[size]引发不一致的溢出
- 在 C++(和 C)中进行类型转换时明显不一致
- 填充上编译器生成的复制构造函数之间的不一致
- 犰狳的 print() 方法和 cout 在从 Rcpp 调用时顺序不一致
- CreateDIBSection为同一图像返回不一致的位图位值
- 在 Qml 中从 QSqlTableModel 中删除单行时视图不一致
- 模板参数推导不一致
- 声明中不一致的no是否违反ODR?
- 如何删除分支因子不一致的树,最大为 30,40
- 从 C++ 函数与 Python 函数返回的不一致值用于偏斜正态分布
- 从 C 字符串构造 std::string 与从另一个 std::string 构造 std::string 不一致
- 这种比较是否不一致(或者存在其他问题)?
- 以下可变参数模板行为是否不一致?
- 如何修复我的链表读数不一致的问题?
- 在C++17中,为什么类模板和函数模板的指针类型推导明显不一致
- void 函数中的指针参数返回不一致的值
- 如何查找导致结果不一致的代码
- 跨平台 mySQL 与字符集不一致
- C++:不一致的 std::p ow( 类型 ) 定义
- 名称查找歧义不一致