在最近的封闭范围内使用using指令声明局部外部变量

Local extern variable declaration with using-directive in the nearest enclosing scope

本文关键字:指令 using 声明局 变量 外部 最近 范围内      更新时间:2023-10-16

这个程序是否符合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使用的,则不能链接。