class 模板的构造函数声明不为 C++20 编译,但为 C++17 编译

class template's constructor declaration doesn't compile for C++20 but compiles for C++17

我正在学习 C++ 中的模板。特别是,我看到 here 我们可以为构造函数声明以下内容:

template<typename T>
struct Rational
{
  Rational<T>();  
};

但上面的代码片段 fails to compile in C++2a and compiles successfully 适用于 C++17。

这是一个编译器错误还是它不能为 C++2a 和 C++2b 编译的原因。如果有原因那么它是什么。我想知道 编译 以下示例中的标准 allow/prevent 中的哪些子句(如果有)。因为我已经用 C++17 和 C++20 测试了上面的例子,所以我只从这两个标准版本中寻找引用。

Is this a compiler bug or there is a reason why it doesn't compile for C++2a and C++2b.

是的,这是自 2020 年以来就存在的 GCC 诊断 错误,请参阅PR 97202

引自 Marek Polacek,一位 GCC 贡献者

This is C++20 DR 2237, disallow simple-template-id in cdtor: see [diff.cpp17.class] p2. Just the diagnostic we give is horrible ;(.

也就是说,这是 DR2237 实施的预期行为,只是诊断有点糟糕。

这不是错误。

这是标准中change的结果。

Affected subclauses: [class.ctor] and [class.dtor] Change: A simple-template-id is no longer valid as the declarator-id of a constructor or destructor. Rationale: Remove potentially error-prone option for redundancy. Effect on original feature: Valid C++ 2017 code may fail to compile in this revision of C++. For example:

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
};

但是有一个 bug report,它最初是关闭的,然后为了改进诊断消息而重新打开。