为什么在需求子句中的否定表达式周围需要括号?

问题描述 投票:0回答:1

以下代码是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

为什么在这里需要括号?

c++ templates c++20 c++-concepts
1个回答
2
投票

需要使用括号,因为它们避免了语言解析的歧义。

© www.soinside.com 2019 - 2024. All rights reserved.