Почему можно использовать возврат лямбды, переданной в качестве аргумента аргумента функции constexpr, в константном вырC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Гость
 Почему можно использовать возврат лямбды, переданной в качестве аргумента аргумента функции constexpr, в константном выр

Сообщение Гость »


Возможно, формулировка заголовка вопроса неверна, и я с радостью исправлю ее, учитывая ваши предложения.

Мой вопрос можно проиллюстрировать этим фрагментом:

#include шаблон constexpr auto make_array_ok (Callable callable) { return std::array{}; }; // constexpr auto make_array_bad(std::size_t s) // { // возвращаем std::array{}; // }; int main(int argc, char**) { static_cast(argc); auto size = []() { return std::size_t{42}; }; // не удалось скомпилировать - как я и ожидал // auto size_dyn = [argc]() { return std::size_t(argc); }; // auto a = make_array_ok(size_dyn); // также не удается скомпилировать — но почему? // auto size_capt = [arg = size()]()constexpr{return arg;}; // auto a = make_array_ok(size_capt); авто а = make_array_ok (размер); вернуть a.size(); } В прямом эфире

Очень часто аргументы функции constexpr считаются непригодными для использования там, где ожидается постоянное выражение (поскольку функция constexpr может быть вызвана во время выполнения с аргументом времени выполнения), поэтому компиляция make_array_bad невозможна. ожидается. Но по каким правилам может компилироваться make_array_ok (при использовании с лямбдой, возвращающей 42)?

Я подозреваю, что это связано с тем, что operator() лямбды по умолчанию является constexpr, начиная с C++17, но я не нашел в cppreference подробностей о функции constexpr, касающейся удобства использования ее аргумента. в константных выражениях.

Но тогда почему это не работает с версией size_capt?
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»