【发布时间】: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;
我曾考虑在新代码中使用此功能,但有 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