类模板参数推导成员变量

Bec*_*con 4 c++ c++17

在C++ 17 Foo中,由于类模板参数推导,我可以在以下示例中使用而不使用空模板参数括号:

template<typename T = int>
struct Foo{};

int main(){
    Foo f;    // before C++17 you had to write "Foo<> f;"
}
Run Code Online (Sandbox Code Playgroud)

为什么我不允许对类成员使用相同的语法?

template<typename T = int>
struct Foo{};

struct Foo2{
    Foo f{};  ///< error: invalid use of template-name 'Foo' without an argument list
};

int main(){
    Foo2 f2;
}
Run Code Online (Sandbox Code Playgroud)

T.C*_*.C. 5

  1. 没有人,IIRC,提出它.
  2. 据推测,出于同样的原因,我们不会从默认成员初始化器中推导出任何内容:它们并不总是被使用 - 构造函数可以通过显式指定不同的初始化程序来覆盖它们.

  • 并且正式地,当将类模板的名称用作正在构造的对象的类型时,执行模板参数推导. (3认同)