c++ - 什么时候需要用括号括起 requires 子句表达式? (一语双关)

标签 c++ c++20 c++-concepts

这给出了一个错误:

template <class T, T A, T B>
    requires A > B             // <-- error
class X{};

error: parentheses are required around this expression in a requires clause

requires A < B

         ~~^~~

         (    )

几乎所有的运算符都会给出这个错误(requires A > B, requires A == B, requires A & B, 需要 !A)

但是 &&|| 似乎有效:

template <class T, T A, T B>
    requires A && B             // <-- ok
class X{};

在 godbolt 上使用 gcc 主干和 clang 主干(2020 年 5 月)进行测试。两种编译器给出相同的结果。

最佳答案

Requires 子句使用特殊的表达式语法来避免certain pathological parsing ambiguities .如前所述on cppreference , 允许的形式是

  • 一个primary expression
  • 用运算符 && 连接的一系列主要表达式
  • 前面提到的一系列表达式,用运算符 || 连接

关于c++ - 什么时候需要用括号括起 requires 子句表达式? (一语双关),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61634337/

相关文章:

c++ - 如何将字符串数组从 C 和 Fortran 传递给 Fortran?

c++ - 自定义 QwtPlot 的比例和网格线

c++ - 模板化 lambda 的显式实例化

c++ - C++ 概念可以用于在 C++ 中实现混合类型 min 和 max 吗?

c++ - C++20 中 "Relation"概念定义背后的动机

c++ - 根据现有标签而不是二值图像使用 OpenCV 查找连接组件

c++ - 示例 Web 服务器和字节序

c++ - 升级到 C++ 20 时对运算符 new[] 的调用不明确

c++ - 如何编写从函数参数推断的 C++ 模板?

c++ - 在概念定义中,是否允许在 requires 表达式之外出现替换失败?