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 测试了上面的示例,因此我只寻找这两个标准版本的引用。
这不是一个错误。
这是标准变化的结果。
受影响的子条款:[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)
然而,有一个错误报告,该报告最初被关闭,然后重新打开,目的是改进诊断消息。
归档时间: |
|
查看次数: |
609 次 |
最近记录: |