cppreference.com 上的 Concepts TS 示例代码是否有误?
Is this sample code for Concepts TS on cppreference.com wrong?
以下代码摘自cppref:
#include <string>
using namespace std::literals;
template<typename T>
concept bool EqualityComparable = requires(T a, T b)
{
{
a == b
}
->bool;
};
void f(EqualityComparable&&) {}
int main()
{
f("abc"s);
}
但是不能用clang-10编译:
[root@mine ~]# clang++ -std=c++20 -stdlib=libc++ main.cpp
main.cpp:6:14: warning: ISO C++20 does not permit the 'bool' keyword after 'concept' [-Wconcepts-ts-compat]
concept bool EqualityComparable = requires(T a, T b)
~~~~~^
main.cpp:11:7: error: expected concept name with optional arguments
->bool;
^
main.cpp:14:8: error: unknown type name 'EqualityComparable'
void f(EqualityComparable&&) {}
^
1 warning and 2 errors generated.
是不是cppref的文档写错了?
Cppreference 站点记录了 C++ 生态系统中的许多内容。其中一些是标准的一部分,其中一些是技术规范的一部分。后者在 URL 中都有 "experimental"(显然在页面顶部有一个大警告文本框),并且只有在您使用相关 TS 时才应使用。在这种情况下,概念 TS,从中采用了 C++20 核心语言特性。
这两者(Concepts TS 和 C++20)有足够的差异,以至于针对一个编写的代码极不可能与另一个的编译器兼容。
以下代码摘自cppref:
#include <string>
using namespace std::literals;
template<typename T>
concept bool EqualityComparable = requires(T a, T b)
{
{
a == b
}
->bool;
};
void f(EqualityComparable&&) {}
int main()
{
f("abc"s);
}
但是不能用clang-10编译:
[root@mine ~]# clang++ -std=c++20 -stdlib=libc++ main.cpp
main.cpp:6:14: warning: ISO C++20 does not permit the 'bool' keyword after 'concept' [-Wconcepts-ts-compat]
concept bool EqualityComparable = requires(T a, T b)
~~~~~^
main.cpp:11:7: error: expected concept name with optional arguments
->bool;
^
main.cpp:14:8: error: unknown type name 'EqualityComparable'
void f(EqualityComparable&&) {}
^
1 warning and 2 errors generated.
是不是cppref的文档写错了?
Cppreference 站点记录了 C++ 生态系统中的许多内容。其中一些是标准的一部分,其中一些是技术规范的一部分。后者在 URL 中都有 "experimental"(显然在页面顶部有一个大警告文本框),并且只有在您使用相关 TS 时才应使用。在这种情况下,概念 TS,从中采用了 C++20 核心语言特性。
这两者(Concepts TS 和 C++20)有足够的差异,以至于针对一个编写的代码极不可能与另一个的编译器兼容。