【问题标题】:Default template parameter cannot be used inside another template parameter?默认模板参数不能在另一个模板参数中使用?
【发布时间】: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&lt;&gt; 编译。 (godbolt)

这是什么原因?扣除指南有帮助吗? NTTP 呢?

【问题讨论】:

  • CTAD 仅适用于某些情况...Foo 的用法不使用其中之一。
  • DefaultType&lt;&gt;在这里真的不太方便吗?空括号仅多了两个字符。
  • @StoryTeller-UnslanderMonica 这并不是真的不方便,但似乎是语言的不一致行为。我想知道我是否遗漏了什么。
  • 如果语言允许 IMO 会更加不一致。 All 参数是可选的,非常小众。大多数模板不这样做。实现需要special-case这种行为,而不是统一解析。

标签: c++ templates c++17 template-argument-deduction


【解决方案1】:

这个:

DefaultType obj; 

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

  • 任何指定变量和变量模板初始化的声明
  • 新表达式
  • 函数式转换表达式
  • 非类型模板参数的类型:

要在其他上下文中使用默认参数实例化DefaultType,您仍然需要编写DefaultType&lt;&gt;

我认为仅在某些上下文中使用 CTAD 的原因是,在这些上下文中您总是需要实例化,但从不希望模板。

【讨论】:

    猜你喜欢
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    相关资源
    最近更新 更多