gpt4 book ai didi

c++ - 为什么静态内联变量需要 "inline"?

转载 作者:IT老高 更新时间:2023-10-28 22:21:26 27 4
gpt4 key购买 nike

C++17 允许这样定义静态成员变量:

class X {
public:
static inline int i = 8;
};

要求 inline 规范的理由是什么?为什么不干脆让程序员写

    static int i = 8;

在类里面?

最佳答案

没有inline,它被明确地声明为只是一个声明。如 [class.static.data]/2 中所述

The declaration of a non-inline static data member in its class definition is not a definition and may be of an incomplete type other than cv void. The definition for a static data member that is not defined inline in the class definition shall appear in a namespace scope enclosing the member's class definition.

其基本原理很可能是为了保持遗留代码的完整性和有效性。回想一下,我们可以在类定义本身中初始化整数常量,因为它大约永远存在。但是 odr 使用它们仍然需要在某些翻译单元中进行类外定义。

因此,使此类变量隐式内联可能在现有代码库中存在问题。在添加核心语言功能时,委员会一直在考虑向后兼容性。

例如,考虑这个有效的 C++03 类定义:

struct foo {
static const int n = 3;
double bar[n];
};

n 可以作为常量表达式来定义bar 的范围,它不被认为是odr-use。现在我们把它写成constexpr1,但是上面的仍然有效。但是可能在某些情况下,n 必须被 odr 使用(想象它的地址被占用,或者绑定(bind)到它的引用等)。它们可能不多,也可能不常见,但某些 API 有疯狂的要求,最终需要这样做

const int foo::n;

出现在某个翻译单元中。

现在,如果 static inline int i = 8; 突然隐含 inline,则上述定义(即在现有代码库中)将违反 odr .现在以前格式正确的代码,格式错误。所以这里最好只允许 explicit inline 生效,因为只有新代码才会真正拥有它。


<子>1 有人可能会争辩说 static constexpr 变量可能有同样的问题(但它们是隐式内联的)。但是 IIRC 他们的原始措辞允许这种更改而不会破坏现有代码。除了名称之外,它基本上已经“内联”了。

关于c++ - 为什么静态内联变量需要 "inline"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46874055/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com