在最近的封闭范围内使用using指令声明局部外部变量
Local extern variable declaration with using-directive in the nearest enclosing scope
这个程序是否符合c++标准?
namespace X { int i = 1; }
using namespace X;
int main() {
extern int i;
i = 2;
}
不同的编译器得到不同的结果:
GCC和Clang给出了一个链接错误:Undefined reference to i.
[basic.link]/p6:
如果有一个实体的可见声明具有相同的名称和类型的链接,忽略在最内层封闭命名空间作用域之外声明的实体,块作用域声明声明相同的实体并接收前一个声明的链接。如果有多个这样的匹配实体,则程序是病态的。否则,如果没有找到匹配的实体,则块作用域实体接收外部链接。
X::i
在外部声明的最内层封闭命名空间(即全局命名空间)之外声明,因此它被忽略。这意味着没有找到i
的声明,因此extern int i
是一个名为i
的具有外部链接的新变量的声明。
你的程序可以编译,但是如果块作用域i
是odr使用的,则不能链接。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 嵌套命名空间的"using"指令,但需要命名内部命名空间
- 在实现文件中,我们应该更喜欢"using namespace"指令还是将实现包装在命名空间 { } 中?
- 在C++头文件中放置 using 指令的位置
- 为什么 using 指令不能与普通函数"associate"?
- 为什么名称查找在找到使用 using 指令隐式声明的实体时不停止?
- 在私有嵌套类上使用 using 指令
- "using"指令如何使用模板成员函数
- 在本地将 'using std::foo' 指令应用于构造函数初始值设定项列表 (C++)
- 为什么无法使用'using'指令实现继承的纯虚拟方法?
- c++using指令的作用域
- 为什么 C++11 中仍然需要 "using" 指令来从派生类中重载的基类中引入方法
- 类内的"Using"指令
- 通过 using-指令调用开始和结束
- visual using指令如何影响C++中的函数参数
- 为什么 C# 中接受"using namespace"指令编码实践?
- #include 指令和"using"语句的顺序在C++头文件的开头是否重要?
- 通过 using-指令在 using-声明中进行名称查找
- 在最近的封闭范围内使用using指令声明局部外部变量
- 通过using指令将私有继承的内部模板公开