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

时间:2015-07-18 17:35:15

标签: c++ namespaces language-lawyer using-directives

这个程序是否符合c ++标准?

namespace X { int i = 1; }

using namespace X;

int main() {
    extern int i;
    i = 2;
}

我使用不同的编译器得到不同的结果:

  • GCC和Clang给出了链接器错误:对i的未定义引用。

  • Visual c ++接受该程序。

1 个答案:

答案 0 :(得分:3)

[basic.link] / P6:

  

如果存在具有相同名称和类型的链接的实体的可见声明,忽略在最内部封闭命名空间范围之外声明的实体,则块范围声明声明该实体并接收链接先前的声明。如果存在多个这样的匹配实体,则该程序是不正确的。否则,如果未找到匹配的实体,则块范围实体将接收外部链接。

on *:JOIN:#channel { .msg $chan $nick take time to register with me; a pm will be sent to you soon } 被声明在extern声明的最内部封闭命名空间之外(即全局命名空间),因此它被忽略。这意味着没有找到X::i的声明,因此i是一个名为extern int i的新变量的声明,带有外部链接。

您的程序将编译,但如果块范围i被使用,则不会链接。