C++ 类模板构造函数是否可以在c++;20

C++ 类模板构造函数是否可以在c++;20,c++,templates,constructor,language-lawyer,c++20,C++,Templates,Constructor,Language Lawyer,C++20,据我所知,以下几点: 使用-std=c++20在叮当作响的主干上编译。这是一个bug,还是c++20中一个尚未在所有编译器中实现的突破性更改?事实上,有一个更改。它记录在C++20草案的兼容性部分 [diff.cpp17.class] 受影响的子条款:[class.ctor]和[class.dtor] 更改:简单模板id不再作为构造函数或析构函数的声明器id有效。 基本原理:删除潜在的易出错冗余选项。 对原始特征< /强>的影响:在本国际标准中,无法编译有效C++ 2017代码。例如: temp

据我所知,以下几点:


使用
-std=c++20
在叮当作响的主干上编译。这是一个bug,还是c++20中一个尚未在所有编译器中实现的突破性更改?

事实上,有一个更改。它记录在C++20草案的兼容性部分

[diff.cpp17.class]

受影响的子条款:[class.ctor]和[class.dtor]
更改:简单模板id不再作为构造函数或析构函数的声明器id有效。
基本原理:删除潜在的易出错冗余选项。
<强>对原始特征< /强>的影响:在本国际标准中,无法编译有效C++ 2017代码。例如:

template<class T>
struct A {
  A<T>();           // error: simple-template-id not allowed for constructor
  A(int);           // OK, injected-class-name used
  ~A<T>();          // error: simple-template-id not allowed for destructor
};
其中,ptr声明符仅由id表达式、可选属性说明符seq和可选周围括号组成,并且id表达式具有以下形式之一:

  • 在属于类的成员规范但不是友元声明的成员声明中,id表达式是直接封闭类的注入类名
  • 在属于类模板的成员规范但不是友元声明的成员声明中,id表达式为 类的当前实例化的名称 立即封闭类模板;或
n4861-C++20标准草案-[class.ctor]

构造函数是由声明器为 表单的函数声明符([dcl.fct])

ptr-declarator ( parameter-declaration-clause ) noexcept-specifier attribute-specifier-seq
ptr-declarator ( parameter-declaration-clause ) noexcept-specifier attribute-specifier-seq
如果ptr声明符仅由id表达式组成,则 可选属性说明符seq和可选环境 括号,id表达式具有以下形式之一:

  • 在属于类或类模板的成员规范但不是友元声明的成员声明中 ([class.friend]),id表达式是注入的类名 ([class.pre])的直接封闭实体或
如你所见,措辞有所改变。现在,C++20在为类模板声明构造函数时需要注入的类名
S
是一个命名专门化的简单模板id。在模板内部,注入的类名只是
S


这是寻址的一部分。

“格式正确”确定吗?据我所知,那里的任何产品都不允许使用模板参数。@n.“代词m。好吧,如果这是对语言的一种改变,那么你就不会在最新的草案中找到规则:)如果它从来都不是格式正确的,为什么它不是格式错误的呢?似乎没有编译器对任何版本进行诊断。那是UB吗?你想要什么样的改变<代码>从未被允许出现在那里。编译器不需要诊断未实例化模板中的错误。一旦模板被实例化,gcc和msvc就会对其进行诊断。叮当声没有,但这似乎是一个错误。我收回我的话,显然我不明白它是如何工作的。啊,那么这是一个突破性的改变?它以前是允许的,但它不是来自c++20?@cigien-看起来是这样的。我看看能不能找出这次事故的具体原因change@cigien-无论如何,问题相关。我倾向于同意2237年的推理。我个人还没有使用或看到简单的模板ID来定义C++之外的构造函数。@ SturytLeunSuldMordICA我今天发现了这段时间,甚至是有效的语法。@ CigiEN:C++中的“特征”或多或少(类名可以是简单的模板ID),因此,没有太多的兼容性理由来保留无用的内容,并建议可以显式地向构造函数提供模板参数。
ptr-declarator ( parameter-declaration-clause ) noexcept-specifier attribute-specifier-seq
ptr-declarator ( parameter-declaration-clause ) noexcept-specifier attribute-specifier-seq