首页 > 解决方案 > requires 表达式是否允许“捕获”封闭范围的变量?

问题描述

在以下示例中,函数参数用于使用 requires 表达式测试使用它们的表达式是否格式正确。requires 表达式不带参数;它直接使用函数范围内的变量:

#include <cstddef>
#include <vector>

template<typename T>
void Resize(T &v, std::size_t const n)
{
  if constexpr (requires { v.resize(n); })
    v.resize(n);
}

template<typename T>
void Eziser(T &v, std::size_t const n)
{
  if constexpr (requires { v.eziser(n); })
    v.eziser(n);
}

int main()
{
  std::vector<int> v;

  Resize(v, 10u);
  Eziser(v, 10u);
}

上面的代码使用 Clang 概念分支编译。但是,GCC10 只接受对Resize. GCC9 ICE。Clang 是否正确地接受了它?

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

解决方案


是的,需求表达式可以使用范围内的任何内容。毕竟,它只需要它命名的任何东西的类型,除了嵌套需求或其他常量表达式。周围的声明和它自己的(正式)参数一样都是如此。

C++20 在 [expr.prim.req]/5 中明确提到了这一点:

需求主体包含一系列需求。这些 要求可以引用本地参数、模板参数和任何其他从封闭上下文可见的声明。

然而,这只是对一般规则的重述,因此已被删除。


推荐阅读