Требуется выражение 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, фрагмент кода доступен в проводнике компилятора .