在下面的示例中,函数参数用于使用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冰克拉昂接受它是对的吗?
发布于 2019-11-07 01:38:55
是的,requires表达式可以使用范围内的任何内容。毕竟,它只需要它命名的任何东西的类型,但嵌套需求或其他常量表达式除外。对于周围的声明和它自己的(形式)参数也是如此。
C++20在expr.prim.req/5中明确提到了这一点:
需求-主体包含一系列需求。这些要求可以引用本地参数、模板参数和从封闭上下文中可见的任何其他声明。
然而,这仅仅是对一般规则的重申,此后就被删除了。
https://stackoverflow.com/questions/58707822
复制相似问题