头文件中的内联函数是否可以使用具有内部链接的常量?

Nei*_*irk 6 c++ const inline one-definition-rule linkage

请考虑以下代码:

const int a = 0;
const std::string b = "hi";

inline void f_a1()
{
    std::cout << a;
}

inline void f_b1()
{
    std::cout << b;
}

inline void f_a2()
{
    std::cout << &a;
}

inline void f_b2()
{
    std::cout << &b;
}
Run Code Online (Sandbox Code Playgroud)

假设此代码存在于将包含在多个翻译单元中的头文件中.

我对内联函数的理解是它们在每个翻译单元中必须完全相同.

我对上面使用的常数的理解是,它们是隐含的,static即内部联系.这意味着每个翻译单元都有自己的副本.

由于上面的内联函数依赖于这些常量,这些函数中的哪一个(如果有的话)是正确的?

eca*_*mur 6

如果包含在多个翻译单元中,唯一有效的功能是f_a1.

相关子句是[basic.def.odr]/6,它声明一个inline函数可以出现在多个翻译单元中,但只能给出:

[...] const如果对象在D的所有定义中具有相同的文字类型,并且该对象使用常量表达式(5.19)初始化,则该名称可以引用具有内部链接或无链接的非易失性 对象,并且该对象没有使用odr,并且对象在D的所有定义中具有相同的值;

作为对象const,它们具有内部链接per [basic.link]/3:

具有命名空间范围(3.3.6)的名称具有内部链接,如果它是[...]的名称
- 一个非易失性变量,显式声明为const或constexpr,既未显式声明为extern,也未声明为具有外部链接[ ...]

但是,获取变量的地址或形成对变量的引用(例如,对于参数传递)是使用odr,因此f_a2并且f_b2无效. f_b1也是无效的,因为ostream输出运算符std::string通过引用获取其参数; 即使它按值获取参数,隐式调用的复制构造函数也会通过引用获取参数. f_a1没问题,因为intstream-out运算符按值获取其参数,并且复制a的值int const不是odr-use.

  • 我不确定`int const`是否成立. (3认同)