默认模板参数不能在另一个模板参数中使用?

Default template parameter cannot be used inside another template parameter?

我有一个 class 模板,模板参数的默认值为:

template<typename T = int>
class DefaultType : private std::array<T, 5> { };

并且从 c++17 开始,这可以像普通的 class

一样被实例化
DefaultType obj; // equivalent to `DefaultType<>`

如果我将此类型用作另一个模板的参数,则无法完成同样的事情:

// error: type/value mismatch at argument 1 in template parameter list for ...
class Foo : public std::vector<DefaultType> { };

然而,上面的代码片段 确实 DefaultType<> 编译。 (godbolt)

这是什么原因?演绎指南会有帮助吗?那么 NTTP 呢?

这个:

DefaultType obj; 

使用 CTAD(class 模板参数推导),自 C++17 起可用且仅在某些上下文中可用:

  • any declaration that specifies initialization of a variable and variable template
  • new-expressions
  • function-style cast expressions
  • the type of a non-type template parameter:

要在其他上下文中使用默认参数实例化 DefaultType,您仍然需要编写 DefaultType<>.

我想只在某些上下文中使用 CTAD 的原因是,在这些上下文中,您总是需要实例化,而不是模板。