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

在下面的示例中,函数参数用于通过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接受它正确吗?

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

是的, requires-expression 可以使用范围内的任何内容。毕竟,除了嵌套需求或其他常量表达式外,它只需要其名称的 type 。周围的声明和它自己的(正式)参数一样。

[expr.prim.req]/5

  

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

本文链接:https://www.f2er.com/3160991.html

大家都在问