默认模板参数不能在另一个模板参数中使用?
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 的原因是,在这些上下文中,您总是需要实例化,而不是模板。
我有一个 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 的原因是,在这些上下文中,您总是需要实例化,而不是模板。