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



随着类类型的非类型模板参数添加到C++20标准(P0732R2(中,引入了使用非类型模板参数[dcl.type.class.dexecute]的推导类类型的占位符§2:

推导类类型的占位符也可以在新类型id或新表达式的类型id中的类型说明符seq中使用,在显式类型转换(函数表示法(中用作简单类型说明符,或在模板参数的参数声明中用作类型说明符

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

template <class T>
struct x{
constexpr x(T){}
};
template <x v>
struct y {};
y <1> b;

使用GCC编译的代码。

我曾想过在新代码中使用此功能,但有三个原因让我认为实际上此功能是要从标准中删除的:

  • 它没有很好地集成在标准中,例如,用于函数模板的部分排序的不变的标准措辞使得不可能部分专用化类似于CCD_ 1的类模板,因为模板参数CCD_;

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

  • 在std讨论中,似乎并不是所有委员会成员都知道这个特性。

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

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

是。[temp.param]/6对此非常清楚:

非类型模板参数应具有以下类型之一(可能符合cv(:

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

关于您的担忧。

它没有很好地集成在标准中,例如,函数模板的部分排序的标准措辞不变,这使得不可能部分专门化类模板[…]

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

参数中占位符的语法看起来像";短概念语法";TS 概念

这正是CTAD语法的样子。

在std讨论中,似乎不是所有委员会成员都知道这个功能。

那么?

最新更新