【发布时间】:2019-11-05 09:05:57
【问题描述】:
在以下示例中,函数参数用于使用 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 是否正确地接受了它?
【问题讨论】:
-
ICE 总是编译器问题。
-
我想说,如果不允许捕获局部变量,它应该拒绝代码(因此
Resize和Eziser都应该被拒绝)或者两个函数都应该编译。我会说 clang 是对的。 -
@Jarod42 是的。 GCC 行为显然是错误的。我会提交PR。我也认为 Clang 是对的,但我想确认一下。
标签: c++ c++20 c++-concepts