是否允许require表达式“捕获”封闭范围的变量?


10

在下面的示例中,函数自变量用于测试require表达式是否可以正确使用它们。require表达式不带参数。它直接使用函数作用域中的变量:

#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接受它正确吗?


2
ICE始终是编译器问题。
Jarod42 '19

我要说的是,无论是如果不允许捕捉局部变量应该拒绝代码(这样既ResizeEziser应该拒绝)或两者功能应该编译。我会说c是正确的。
Jarod42 '19

@ Jarod42是的。GCC行为显然是错误的。我要提交公关 我也认为Clang是正确的,但我想确认一下。
metalfox

Answers:


6

是的,require-expression可以使用范围内的任何内容。毕竟,除了嵌套要求或其他常量表达式中,它仅需要其命名的任何类型。周围的声明与它自己的(正式)参数一样多。

[expr.prim.req] / 5

要求,身体会包含一系列要求。这些 要求可以引用局部参数,模板参数以及从封闭上下文可见的任何其他声明。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.