C++ C++;检查函数签名所需的表达式不适用于gcc中的Lambdas或成员函数

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;

可以使用c++20 requires表达式来检查是否存在特定的函数或类型,例如在模板参数中和在概念中使用

在下面的代码片段中,我使用
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();  });
}