C++17 默认模板参数:无效使用没有参数列表的模板名称

dco*_*con 6 c++ templates c++17

使用 C++17,您可以在 main 中进行类模板参数推导,如下例所示:

template<class T = int>
struct X{};

int main()
{
    X myX;
}
Run Code Online (Sandbox Code Playgroud)

为什么数据成员不允许模板参数推导?

template<class T = int>
struct X{};

struct Y
{
   X myX;
};

int main()
{
   Y myY;
}
Run Code Online (Sandbox Code Playgroud)

错误:在没有参数列表 X myX 的情况下无效使用模板名称“X”;

JVA*_*pen 6

我没有参与这个决定,但是,我确实看到允许它存在一些问题。让我们假设以下代码:

template<class T = int>
struct X
{
    X(T t = T{}) {}
};
Run Code Online (Sandbox Code Playgroud)

这使您的变量仍然可以:

int main()
{
     Y myY;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果 Y 有一个在单独文件中实现的构造函数呢?

struct Y
{
    Y();
    X myX{'a'};
};

Y::Y() : myX{0.0} {}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们是否期望myXX<int>orX<double>X<char>

我可以看到对此可能存在混淆。由于标准委员会无法恢复其决定,因此最好采取确定的一小步,看看人们是否需要它以及他们期望发生的事情。