为什么静态内联变量需要"inline"?
Why is "inline" required on static inline variables?
C++17允许静态成员变量定义如下:
class X {
public:
static inline int i = 8;
};
要求inline
规范的基本原理是什么?为什么不简单地允许程序员编写
static int i = 8;
在课堂上?
在没有inline
的情况下,它被明确地声明为一个声明。按照[class.static.data]/2 中的规定
类中非内联静态数据成员的声明定义不是定义,可能是不完整类型比cv无效。不是的静态数据成员的定义类定义中内联定义的应出现在命名空间中包含成员的类定义的范围。
基本原理很可能是保持遗留代码的完整性和有效性。回想一下,我们可以从大约永远开始初始化类定义本身中的积分常数。但是odr使用它们仍然需要在某些翻译单元中进行类外定义。
因此,在现有的代码库中,使这些变量隐式内联可能会产生问题。当添加核心语言功能时,委员会总是考虑向后兼容性。
例如,考虑这个有效的C++03类定义:
struct foo {
static const int n = 3;
double bar[n];
};
n
可以用作常数表达式来定义bar
的范围,它不被认为是odr用途。现在我们把它写成constexpr
1,但是上面的仍然有效。但是,如果必须使用n
,则可能存在的情况(想象它的地址被占用,或者绑定到它的引用,等等)。它们可能不多,也可能不常见,但某些API有疯狂的需求,最终将需要这种
const int foo::n;
出现在某个翻译单元中。
现在,如果static inline int i = 8;
突然隐式地变成inline
,那么上面的定义(即在现有的代码库中)将是odr冲突。现在,以前格式良好的代码是格式错误的。因此,最好只允许显式inline
在这里生效,因为只有新代码才会真正拥有它
1有人可能会认为static constexpr
变量可能有同样的问题(但它们是隐式内联的)。但IIRC最初的措辞允许这一改变,而不会破坏现有的规范。除了名字之外,它基本上已经"内联"了
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 激励'inline'说明符的真实世界示例?
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- C++中的"inline"关键字
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 'inline'变量可以像内联函数一样内联吗?
- 为什么静态内联变量需要"inline"?
- 模板' inline '函数的静态局部变量