类模板的构造函数声明不针对 C++20 进行编译,但针对 C++17 进行编译

use*_*570 4 c++ language-lawyer class-template c++17 c++20

我正在学习 C++ 中的模板。特别是,我在这里看到我们可以对构造函数进行以下声明:

template<typename T>
struct Rational
{
  Rational<T>();  
};
Run Code Online (Sandbox Code Playgroud)

但上面的代码片段在 C++2a 中编译失败,在 C++17 中编译成功。

这是编译器错误还是有原因导致它无法针对 C++2a 和 C++2b 进行编译。如果有原因的话,那是什么原因呢?我想知道标准中的哪些子句(如果有)允许/阻止以下示例进行编译。由于我已经使用 C++17 和 C++20 测试了上面的示例,因此我只寻找这两个标准版本的引用。

sup*_*per 5

这不是一个错误。

这是标准变化的结果。

受影响的子条款:[class.ctor] 和 [class.dtor] 更改:简单模板 id 不再有效作为构造函数或析构函数的声明符 id。理由:删除可能容易出错的冗余选项。对原始功能的影响:有效的 C++ 2017 代码可​​能无法在此版本的 C++ 中编译。例如:

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
};
Run Code Online (Sandbox Code Playgroud)

然而,有一个错误报告,该报告最初被关闭,然后重新打开,目的是改进诊断消息。