【发布时间】:2022-01-19 10:56:05
【问题描述】:
我有一个带有模板参数默认值的类模板:
template<typename T = int>
class DefaultType : private std::array<T, 5> { };
从 c++17 开始,它可以像普通类一样实例化
DefaultType obj; // equivalent to `DefaultType<>`
如果我将此类型用作另一个模板的参数,则无法完成相同的操作:
// error: type/value mismatch at argument 1 in template parameter list for ...
class Foo : public std::vector<DefaultType> { };
然而,上面的 sn-p 确实 用DefaultType<> 编译。
(godbolt)
这是什么原因?扣除指南有帮助吗? NTTP 呢?
【问题讨论】:
-
CTAD 仅适用于某些情况...
Foo的用法不使用其中之一。 -
DefaultType<>在这里真的不太方便吗?空括号仅多了两个字符。 -
@StoryTeller-UnslanderMonica 这并不是真的不方便,但似乎是语言的不一致行为。我想知道我是否遗漏了什么。
-
如果语言允许 IMO 会更加不一致。 All 参数是可选的,非常小众。大多数模板不这样做。实现需要special-case这种行为,而不是统一解析。
标签: c++ templates c++17 template-argument-deduction