是否都是隐式内联的 constexpr 变量

Are all constexpr variable implicitly inline?

本文关键字:constexpr 变量 是否      更新时间:2023-10-16

我正在玩自动模板参数,我很惊讶这段代码没有编译:

constexpr auto bar = 2;
template<auto& T>
struct Foo {
    auto operator()() const { return T; }
};
int main() {
    Foo<bar> b;
    b();
}

Visual Studio 15.7(预览版 4(会吐出以下错误:

error C2970: 'Foo': template parameter 'T': 'bar': an expression involving objects with internal linkage cannot be used as a non-type argument
 note: see declaration of 'Foo'
 note: see declaration of 'bar'
error C2440: 'specialization': cannot convert from 'int' to 'int &'
 note: see reference to class template instantiation 'Foo<0>' being compiled
error C2973: 'Foo': invalid template argument 'int'
 note: see declaration of 'Foo'

然后,添加inline后,错误消失了!

constexpr inline auto bar = 2;

我认为constexpr变量是隐式inline的。另外,这对我的变量bar的链接有何影响?

所有的 constexpr 变量都是隐式内联的吗?

不。只有 constexpr 函数和 constexpr 静态数据成员是隐式内联的 ([dcl.constexpr]/1(。

另外,这对我的变量杆的链接有何影响?

constexpr 变量是 const ([dcl.constexpr]/9(。未显式声明extern具有内部链接的非内联const变量 ([basic.link]/3(。