此问题已在此处有答案:
Why do we require requires requires?(5个答案)
3天前关闭。
这段代码不会在任何C++兼容编译器(Clang,GCC,MSVC)上编译:
template<typename T>
requires(T t) { typename T::name; }
class MyVector
{
};
错误:
--- Clang ----
<source>:9:14: error: 'T' does not refer to a value
requires(T t) { typename T::name; }
^
<source>:8:19: note: declared here
template<typename T>
^
--- GCC ----
<source>:9:16: error: expected primary-expression before 't'
9 | requires(T t) { typename T::name; }
--- MSVC ----
<source>(9): error C2760: syntax error: 't' was unexpected here; expected ')'
<source>(9): error C2059: syntax error: ')'
但这将:
template<typename T>
requires std::is_integral_v<T> &&
requires(T t) { typename T::name; }
class MyVector{};
有趣的是,这也将编译罚款!
template<typename T>
requires true &&
requires(T t) { typename T::name; }
class MyVector{};
我知道可以使用concept
来代替,但我只尝试了requires
。
1条答案
按热度按时间wwtsj6pe1#
requires(T t) { typename T::name; }
是一个 requires-expression。然而,在模板声明的模板头下,你可以(可选地)只放一个 requires-clause,而不是 requires-expression。
requires
关键字,但与 requires-expression 的含义不同。requires-clause 具有requires E
的形式,其中E
是由约束表达式的合取/析取形成的表达式。原子约束可以是 requires-expression:在两个
和
你正在使用正确的语法。第一个
requires
引入了 requires-clause,&&
是各个约束表达式之间的连接,第二个requires
引入了 requires-expression 作为约束表达式之一。