【发布时间】:2020-08-28 06:41:48
【问题描述】:
当使用requires 子句的类模板的成员在类外部定义时,如果未指定requires,gcc 不会报错,而clang 会报错。
考虑下面的代码 sn-p:
#include <concepts>
template<typename Container>
requires std::integral<typename Container::value_type>
class Foo {
public:
void func();
};
template<typename Container>
void Foo<Container>::func()
{}
使用gcc 编译不会报错。
而clang 报告以下错误:
❯ clang++ -std=c++2a test.cpp
test.cpp:10:1: error: requires clause differs in template redeclaration
template<typename Container>
^
test.cpp:4:19: note: previous template declaration is here
requires std::integral<typename Container::value_type>
^
1 error generated.
如果我将定义更改如下:
template<typename Container>
requires std::integral<typename Container::value_type>
void Foo<Container>::func()
{}
现在clang 不会抱怨了。
gcc --version 的输出:
gcc (GCC) 10.2.0
clang --version 的输出:
clang version 10.0.1
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
这是要报告的错误吗?
【问题讨论】:
标签: c++ templates language-lawyer c++20 c++-concepts