【发布时间】:2019-06-09 14:10:47
【问题描述】:
C++20 概念的一个角落是在某些情况下您必须编写requires requires。比如这个例子来自[expr.prim.req]/3:
requires-expression 也可以在 requires-clause ([temp]) 中使用,作为在模板参数上编写临时约束的一种方式,例如下面:
template<typename T> requires requires (T x) { x + x; } T add(T a, T b) { return a + b; }第一个 requires 引入 requires-clause,第二个引入 requires-expression。
需要第二个 requires 关键字背后的技术原因是什么?为什么我们不能只允许写作:
template<typename T>
requires (T x) { x + x; }
T add(T a, T b) { return a + b; }
(注意:请不要回答那个语法requires吧)
【问题讨论】:
-
似乎
requires可能用于模板类的方法,它会“模棱两可”template <typename T> struct S {void f(T t) requires requires (T x) {x + x;} { t + t;} }; -
建议:“有什么需要需要的吗?”。更严重的是,我有一种预感,这与
noexcept(noexcept(...))背后的原因相同。 -
他们说“第一个 requires 引入了 requires-clause,第二个引入了 requires-expression。”,但这与他们上面给出的语法不兼容
-
@Quentin 与
noexcept存在歧义。如果f()计算结果为真或f()为noexcept,noexcept(f())可能意味着noexcept。 -
这两个
requires在我看来是同音异义词:它们看起来一样,拼写一样,闻起来一样,但本质上是不同的。如果我建议修复,我建议重命名其中一个。
标签: c++ c++-concepts c++20