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即内部联系.这意味着每个翻译单元都有自己的副本.
由于上面的内联函数依赖于这些常量,这些函数中的哪一个(如果有的话)是正确的?
如果包含在多个翻译单元中,唯一有效的功能是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.
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |