定义静态constexpr自动类变量

时间:2015-08-24 01:41:26

标签: c++ c++11 language-lawyer c++14 auto

由于未定义的引用,以下代码无法链接:

// file.h
struct S {
    static constexpr auto x = 0;
};

// file.cpp
int main() {
    auto const & ref = S::x;
}

遵循Why doesn't the C++11 'auto' keyword work for static members?的建议,这似乎适用于clang 3.5:

// 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与non-auto混合)。

1 个答案:

答案 0 :(得分:2)

auto 类型说明符有两个相关但又分开的用途

[dcl.spec.auto] / 1

  

autodecltype(auto) 类型说明符用于   指定一个占位符类型,稍后将通过演绎进行替换   来自初始化器。 auto 类型说明符也用于   引入具有尾随返回类型或的函数类型   表示lambda是一个普通的lambda。

对于静态成员,类型由初始化程序确定,因此x在声明结尾处已经有类型int

[dcl.spec.auto] / 4

  

使用autodecltype(auto)声明的变量的类型是   从初始化程序推断出来。

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

[dcl.spec.auto] / 13

  

功能或功能模板的重新声明或特化   使用占位符类型的声明返回类型也应该   使用该占位符,而不是推断类型。