内联命名空间变量有内部链接吗?如果没有,为什么下面的代码有效

Do inline namespace variables have internal linkage? If not, why does the code below work?

本文关键字:为什么 有效 代码 如果没有 变量 命名空间 内部 链接      更新时间:2023-10-16

这个问题与这个问题直接相关。考虑代码:

#include <iostream>
inline namespace N1
{
    int x = 42;
}
int x = 10;
int main()
{
    extern int x;
    std::cout << x; // displays 10
}

显示10。如果我删除extern int x;声明,那么我们得到一个模糊编译器时间错误

错误:对"x"的引用不明确

问题:为什么使用extern int x声明的代码可以工作,为什么当我删除它时它会停止工作?是因为内联命名空间变量具有内部链接吗?

否。[basic.link]中没有导致x具有内部链接的规定。具体来说,"所有其他命名空间都有外部链接。","其他"表示"未命名"。也许您正在考虑未命名的命名空间

不,代码之所以有效,是因为为了避免破坏现有的C代码,extern int x;必须以与在C中相同的方式工作,换句话说,为全局命名空间(这就是我们在C中所拥有的)变量创建一个本地extern。然后,当您稍后使用它时,本地声明的extern会消除任何可能的歧义。