C++ C++;检查函数签名所需的表达式不适用于gcc中的Lambdas或成员函数
可以使用c++20 requires表达式来检查是否存在特定的函数或类型,例如在模板参数中和在概念中使用 在下面的代码片段中,我使用C++ C++;检查函数签名所需的表达式不适用于gcc中的Lambdas或成员函数,c++,lambda,c++20,c++-concepts,C++,Lambda,C++20,C++ Concepts,可以使用c++20 requires表达式来检查是否存在特定的函数或类型,例如在模板参数中和在概念中使用 在下面的代码片段中,我使用requires表达式来检查函数的签名。 我希望要求表达式对lambda和定义的函数计算为true。 但lambda表达式的表达式失败。 为什么会这样? int func(int a) noexcept { return 1; } int main() { auto lam = [](int a) noexcept -> int { return 1;
requires
表达式来检查函数的签名。
我希望要求表达式对lambda和定义的函数计算为true
。
但lambda表达式的表达式失败。
为什么会这样?
int func(int a) noexcept { return 1; }
int main() {
auto lam = [](int a) noexcept -> int { return 1; };
// works fine for a function with this signature:
static_assert(requires(int a) { { func(a) } ->std::same_as<int>; });
// the following three conditions each evaluate to false for the lambda
static_assert(requires(int a) {
lam(a);
{lam(a)}->std::same_as<int>;
requires std::is_same_v<decltype(lam(a)), int>;
});
return 0;
}
在gcc-10.0和gcc-trunk上编译的代码snipplet在上可用。gcc bug(尽管您的嵌套requires
表达式格式不正确)已提交。我没有意识到这一点。我还修复了问题中的代码snipplet,它的计算结果为true(只有前面的两个表达式似乎受到bug的影响)。感谢您提交错误@Barry为什么嵌套的requires
表达式格式不正确?@Oliv我在问题的第一个版本中缺少'decltype(…)',在阅读Barry的答案后,我在编辑中修复了这个问题。提交的gcc bug(尽管嵌套的requires
表达式格式不正确)。我没有意识到这一点。我还修复了问题中的代码snipplet,它的计算结果为true(只有前面的两个表达式似乎受到bug的影响)。感谢您提交错误@Barry为什么嵌套的requires
表达式格式不正确?@Oliv我在问题的第一个版本中缺少“decltype(…)”,在阅读Barry的答案后,我在编辑中修复了这个问题。
struct T { void f() noexcept; };
int main() {
static_assert(requires(T o) { o.f(); });
}