由于未定义的引用,以下代码无法链接:
// 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混合)。
答案 0 :(得分:2)
auto
类型说明符有两个相关但又分开的用途
[dcl.spec.auto] / 1
auto
和decltype(auto)
类型说明符用于 指定一个占位符类型,稍后将通过演绎进行替换 来自初始化器。auto
类型说明符也用于 引入具有尾随返回类型或的函数类型 表示lambda是一个普通的lambda。
对于静态成员,类型由初始化程序确定,因此x
在声明结尾处已经有类型int
。
[dcl.spec.auto] / 4
使用
auto
或decltype(auto)
声明的变量的类型是 从初始化程序推断出来。
您提到的规则仅适用于函数和函数模板,与声明变量时auto
的使用无关。
[dcl.spec.auto] / 13
功能或功能模板的重新声明或特化 使用占位符类型的声明返回类型也应该 使用该占位符,而不是推断类型。