可以在类数据成员中使用模板参数推导吗?

rab*_*exc 12 c++ gcc c++17

C++ 17引入了模板参数推导.

使用gcc-7.2,我可以在一个函数中轻松使用它:

int test() {
  std::pair d(0, 0.0);
}
Run Code Online (Sandbox Code Playgroud)

我期望在类非静态数据成员中使用相同的语法,例如:

class Test {
  std::pair d_{0, 0.0};
};
Run Code Online (Sandbox Code Playgroud)

但这会导致GCC error: invalid use of template-name ... without an argument list,与--std=c++17通过.

我尝试了其他一些组合,但似乎都没有.

这是标准的预期行为,还是编译器不完全支持的情况?我找不到标准中对类数据成员的任何明确引用.

我的用例当然要复杂得多,这种语法非常方便(想想传递和存储的函数).

Bar*_*rry 10

这是标准的预期行为,还是编译器不完全支持的情况?

是的,这是预期的行为.[dcl.type.class.deduct]读取:

如果推导类类型的占位符在变量的初始化声明([dcl.init])的decl-specifier-seq中显示为decl-specifier,[...]

一种用于推导的类类型的占位符,也可在所使用的类型说明符-SEQ新型-ID类型-ID一个的新的表达,或者作为简单型说明符在一个显式的类型转换(功能符号).推断类类型的占位符不应出​​现在任何其他上下文中.

非静态数据成员不是变量,我们处于其他任何情况.

请注意,对于尝试声明的非静态数据成员,同样的原则也是如此auto:

struct X {
    auto y = 0; // error
};
Run Code Online (Sandbox Code Playgroud)

默认的成员初始化程序就是 - 默认的初始化程序.如果您提供了使用不同类型的表达式初始化成员的构造函数,该怎么办?