内联变量的语义

semantics of inline variable

众所周知,对于内联函数,每当它们被编译器调用时 "replaces" 函数体对函数的实际调用。

但是 C++17 中提出的内联变量呢?它们的语义是什么?

不,不能保证调用内联函数实际上会导致函数被内联。例如,如果内联函数递归调用自身,那么它可能不会被内联。同样,通过函数指针变量的调用通常不能被内联。

如果内联函数有外部链接,那么在链接过程中,如果内联函数在多个翻译单元中定义,链接器选择包含定义的翻译单元之一,并解析所有剩余的引用(即, 未被编译器内联的 odr-uses)到该函数到所选翻译单元中的定义,丢弃其余定义。内联变量的工作方式相同。

通常函数和变量必须定义一次(space 分配给它们,变量 space 或函数代码 body)仅一次。内联函数放宽了允许多个定义(因为定义通过包含文件被拉入多个模块),所有这些都必须相同。如果函数是实际引用的,而不是复制的 in-line,则将通过丢弃除一份副本以外的所有副本并使该副本成为二进制文件中的正式副本来合并多个定义。

内联变量为例如做同样的事情。静态 class 成员。不必创建一个仅包含单个成员变量定义的 class body 源文件,您可以在 class header 文件和生成的多个定义(包含 class header 的每个模块中的一个定义)将合并到二进制文件中的单个实例中,而不会导致编译器或链接器错误。

This paper discusses it in technical detail.