Почему можно использовать возврат лямбды, переданной в качестве аргумента аргумента функции constexpr, в константном выр ⇐ 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?
Возможно, формулировка заголовка вопроса неверна, и я с радостью исправлю ее, учитывая ваши предложения.
Мой вопрос можно проиллюстрировать этим фрагментом:
#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?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение