以下代码是requires
子句的用法示例:
#include <type_traits>
template <typename T>
requires std::is_integral_v<T>
void take_integral(T value);
它接受一个评估为bool
值(在这种情况下为std::is_integral_v<T>
)的表达式,并按预期工作。但是,当使用!
运算符将此类表达式取反时,将导致编译错误:
#include <type_traits>
template <typename T>
requires !std::is_integral_v<T>
void take_integral(T value);
来自GCC的诊断:
<source>:4:12: error: expression must be enclosed in parentheses
4 | requires !std::is_integral_v<T>
| ^~~~~~~~~~~~~~~~~~~~~~
| ( )
Compiler returned: 1
通过Clang诊断:
<source>:4:12: error: parentheses are required around this expression in a requires clause
requires !std::is_integral_v<T>
^~~~~~~~~~~~~~~~~~~~~~
( )
1 error generated.
Compiler returned: 1
为什么在这里需要括号?
需要使用括号,因为它们避免了语言解析的歧义。