C ++ Требуется выражение для проверки подписи функции не работает для Lambdas или функций-членов в gcc - PullRequest
1 голос
/ 21 марта 2020

Требуется выражение c ++ 20, чтобы проверить, существуют ли определенные c функции или типы, например, в аргументе шаблона и используются в понятии.

В приведенном ниже фрагменте кода я использую requires выражение для проверки подписи функции. Я ожидал, что выражение requires будет равно true как для лямбда-выражения, так и для определенной функции. Выражение не для лямбда-выражения, хотя. Почему это так?

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; 
}

То же самое относится к произвольным функциям-членам:

struct T { void f() noexcept; };

int main() {
  static_assert(requires(T o) {    o.f();  });
}

Скомпилировано для g cc -10.0 и g cc -trunk, фрагмент кода доступен в проводнике компилятора .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...