定义静态constexpr自动类变量

Defining static constexpr auto class variable

本文关键字:类变量 constexpr 静态 定义      更新时间:2023-10-16

由于引用未定义,以下代码链接失败:

// file.h
struct S {
    static constexpr auto x = 0;
};
// file.cpp
int main() {
    auto const & ref = S::x;
}

遵循C++11 'auto'关键字工作的静态成员?

// file.h
struct S {
    static constexpr auto x = 0;
};
// file.cpp
constexpr decltype(S::x) S::x;
int main() {
    auto const & ref = S::x;
}

它实际上是有效的c++吗?这似乎违反了函数遵循的"auto无处不在或无处不在"的规则(您可以向前声明一个返回auto的函数,然后将其定义为返回auto,但您不能将auto与非auto混合使用)。

auto 类型说明符服务于两个相关但独立的目的

[dcl.spec。/1

autodecltype(auto) 类型说明符s用于指定一个占位符类型,稍后将由演绎替换从初始化器。auto 类型说明符也用于引入具有尾随返回类型或to的函数类型表示一个lambda是一个泛型lambda。

在静态成员的情况下,类型由初始化器决定,因此x在其声明的末尾已经具有int类型。

[dcl.spec。/4

使用autodecltype(auto)声明的变量的类型是

你提到的规则只适用于函数和函数模板,与声明变量时使用auto无关。

[dcl.spec。Auto]/13

函数或函数模板的重声明或特化使用占位符类型声明的返回类型使用该占位符,而不是推导出的类型。