【问题标题】:Is placeholder for the deduced class type of non-type template parameter a C++20 feature?非类型模板参数的推导类类型的占位符是 C++20 功能吗?
【发布时间】:2020-08-09 20:45:43
【问题描述】:

在 C++20 标准 (P0732R2) 中添加了类类型的非类型模板参数,引入了使用声明非类型模板参数的可能性 非类型模板参数[dcl.type.class.deduct]§2的推导类类型的占位符:

推导类类型的占位符也可以用在 new-type-id 或 new-expression 的 type-id 中的 type-specifier-seq 中,作为显式类型转换中的 simple-type-specifier (功能符号),或作为模板参数的参数声明中的类型说明符。

加粗的是在标准中添加了P0732R2。这允许这样的代码:

template <class T>
struct x{
   constexpr x(T){}
};

template <x v>
struct y {};

y <1> b;

compiles with GCC.的代码

我曾考虑在新代码中使用此功能,但有 3 个原因让我认为实际上此功能是打算从标准中删除的:

  • 它没有很好地集成到标准中,例如,函数模板的部分排序的标准措辞没有改变,使得无法部分特化类似于y的类模板,因为模板参数v的综合参数必须有一个独特的发明类型(在类模板特化的部分排序期间使用的综合参数);

  • 参数中占位符的这种语法看起来像concept-TS 的“短概念语法”。在标准中加入 P0732R2 后,此语法已更改为“形容词语法”concept-name auto

  • 在标准讨论中,似乎并非所有委员会成员都知道此功能。

非类型模板参数的推导类类型的占位符是C++20特性吗?

【问题讨论】:

  • 鉴于您明确引用了允许它的语言规则,除了“显然,是”之外,您究竟在寻找什么作为问题的答案?
  • 您是否考虑过改用auto for non-type template parameter?它已经是 C++17 的一部分。
  • @Barry "Yes" 实际上会让我大吃一惊。没有人指出,标准的编写方式,不可能声明y的部分特化?
  • @Barry 还有我列出的其他 3 个原因。但如果你回答“是”,我就足以开始考虑此功能提供的解决方案。通常我是一个早期采用者,但在这里,我觉得标准化过程中发生了一些错误,所以我想知道这个 13 个单词的条款是否不会作为 DR 的一部分被删除。

标签: c++ language-lawyer standards c++20


【解决方案1】:

非类型模板参数的推导类类型的占位符是C++20特性吗?

是的。 [temp.param]/6 很清楚这一点:

非类型模板参数应具有以下类型之一(可能是 cv 限定的):

  • 一种结构类型(见下文),
  • 包含占位符类型 ([dcl.spec.auto]) 的类型,或
  • 推导的类类型 ([dcl.type.class.deduct]) 的占位符。

至于你的顾虑。

它没有很好地集成到标准中,例如,函数模板的部分排序的标准措辞没有改变,使得类模板无法部分特化 [...]

是的,添加的语言经常不完整并导致语言问题。更紧迫的是对哪些类型可以用作非类型模板参数的限制,禁止std::stringstd::tuplestd::optional的限制和时刻。这些将在适当的时候得到解决。

参数中占位符的这种语法看起来像concept-TS的“短概念语法”

这正是 CTAD 语法的样子。

在标准讨论中,似乎并非所有委员会成员都知道此功能。

那么?

【讨论】:

  • 所以我怀疑:我写了一封邮件来通知标准中有关此功能的漏洞,我收到的唯一答复是告诉我此功能不在 C++20 标准中。
  • @Barry: "更紧迫的是限制哪些类型可以用作非类型模板参数" 这不是真正的语言问题。它更像是语言可以做更多的领域,但这与实际问题是分开的。语言不完整的问题:它说你可以在这里做一件事,但它从来没有说在它应该解释它的地方如何工作。
猜你喜欢
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
  • 2018-05-01
相关资源
最近更新 更多