内联命名空间变量有内部链接吗?如果没有,为什么下面的代码有效
Do inline namespace variables have internal linkage? If not, why does the code below work?
这个问题与这个问题直接相关。考虑代码:
#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会消除任何可能的歧义。
相关文章:
- 为什么是0;C++中的有效语句
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 为什么这种直接初始化有效?(C++17)
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 为什么浮点数的矢量化比双精度更有效?
- 为什么模板参数中的双冒号有效?
- 为什么在这种情况下递增阵列名称有效?
- 为什么TinyXML2的XMLDocument::FirstChild()函数在尝试解析这个有效的XML文件时返回NULL?
- 这是什么代码?为什么它有效?C++
- 为什么别名声明不是有效的 init 语句(/simple-declaration)?
- 为什么在 C/C++ 中交织 switch/for/if 语句是有效的?
- 为什么这个复合语句作为用大括号和括号括起来的语句序列似乎不是有效的语句表达式
- 为什么使用不匹配的参数调用重载函数仍然有效
- 通过指针调用模板类成员函数 [为什么这是有效的 c++]?
- 将第一个派生类转换为第二个派生类 - 为什么有效?
- 通过 typedef 模板<类型名 T、T> 强制模板实例化 - 为什么有效?
- 这究竟为什么有效?(静态还是其他?)
- 从 r 值引用转换为 l 值引用,为什么有效
- 默认模板参数 - 不必来自右边?为什么有效?
- 为什么 X 有效但未声明?C++