使用指令的行为
Behavior of using-directive
本文关键字:指令 更新时间:2023-10-16
我对使用指令感到困惑。
根据C++11标准§7.3.4 p.3,
using指令不会向其出现的声明性区域添加任何成员
此外,C++11标准§7.3.4不处理限定名称查找。
因此,IMHO使用指令对限定名称查找没有影响
例如,我认为下面的示例代码应该会导致编译错误。
#include <iostream>
namespace A {
namespace B {
int i = 1;
}
using namespace B;
}
int main()
{
std::cout << A::i << std::endl;
}
但是gcc和clang都成功地编译了这段代码。(http://melpon.org/wandbox/permlink/rXPjE5k12yMtlvMg)
此外,C++11标准§7.3.1.1指出,未命名的名称空间定义的行为就好像它被取代了一样
inlineopt命名空间唯一{/*空正文*/}使用命名空间唯一;namespaceunique{namespace body}
并显示以下示例(省略了不必要的部分)。
namespace { int i; } // unique::i
namespace A {
namespace {
int i; // A::unique::i
}
}
using namespace A;
void h() {
i++; // error: unique::i or A::unique::i
A::i++; // A::unique::i
}
这个例子说函数h
的A::i
可以引用未命名的名称空间成员i
。
帮帮我,我再也听不懂了。
你能教我使用指令的正确解释吗?
具有7.3.4
using指令指定指定命名空间中的名称可以在using指令出现在using指令。在非限定名称查找(3.4.1.)期间名称看起来好像是在最近的封闭中声明的同时包含using指令和指定的命名空间命名空间。[注:在此上下文中,"包含"表示"包含直接或间接"。——尾注]
using指令不向声明性区域添加任何成员它出现在其中。
上面解释说using指令将名称拉入范围,而不是声明(命名空间成员),它本身
这可以说明:
namespace N {
template <typename T> void f() {};
}
using namespace N;
// error: specialization of ‘template<class T> void N::f()’ in different
// namespace
template <> void f<int>() {};
在第二个示例中,有两个未命名的名称空间:
应用一些小更改:
#include <iostream>
namespace { int i = 0; } // unique::i
namespace A {
namespace {
int i = 1; // A::unique::i
}
}
using namespace A;
int main () {
// i++; // error: unique::i or A::unique::i
// The i having the value 1:
std::cout << A::i << std::endl; // A::unique::i
return 0;
}
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- C++:对不存在的命名空间使用命名空间指令
- 函数名是c中该函数的第一条指令的地址吗
- 错误:无效的预处理指令 #i 的意思是 #if?
- 组装指令中乘法的下部和上部是什么
- OpenMP 与有序和关键指令并行
- C++中的移动分配出现问题.非法指令: 4.
- 嵌套命名空间的"using"指令,但需要命名内部命名空间
- C++CMake编译指令与
- 使用宏扩展的泛型:为什么指令缓存使用不当?
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- AVX 指令中寄存器和指针之间的客观差异
- while 循环 c++ 中的非法指令
- 如何在编译时定义C++预处理器指令的值?
- 存储指令是否会阻止缓存未命中的后续指令?
- 保证编译器指令在C++中重新排序
- VS2008中的AVX-512指令库
- 令人困惑的定义指令在C ++项目中
- 是否有用于元素部分移位的 simd 指令/内在/内置指令?