Инициализация статического члена constexpr типа std::array в C++14 [дубликат] ⇐ C++
Инициализация статического члена constexpr типа std::array в C++14 [дубликат]
Мне не удается программно инициализировать статический элемент constexpr std::array.
Это минимальный пример моей проблемы (для упрощения размер известен и мал, поэтому инициализация может быть ручной, но я бы хотел сделать фактический размер нетиповым параметром шаблона, тем самым исключая инициализацию вручную): #include constexpr std::size_t N = 3; используя Mat = std::array; // ОК, можно инициализировать свободный constexpr Mat constexpr Mat InitEye() noException { Мат TmpEye{0}; for (std::size_t r = 0; r < N; ++r) { for (std::size_t c = 0; c < N; ++c) { TmpEye[r * N + c] = (r == c) ? 1. : 0.; } } вернуть TmpEye; } // КО класс-оболочка { частный: // КО не может использовать его для инициализации статического члена constexpr static constexpr Mat WrappedInitEye() noException { Мат TmpEye{0}; for (std::size_t r = 0; r < N; ++r) { for (std::size_t c = 0; c < N; ++c) { TmpEye[r * N + c] = (r == c) ? 1. : 0.; } } вернуть TmpEye; } публика: статический constexpr Mat Eye = WrappedInitEye(); }; // также нокаут класс Обертка2 { публика: // ОК в C++17, но в C++17 все еще нокаут из-за отсутствия оператора доступа constexpr static constexpr Mat Eye = [] { Мат TmpEye{0}; for (std::size_t r = 0; r < N; ++r) { for (std::size_t c = 0; c < N; ++c) { TmpEye[r * N + c] = (r == c) ? 1. : 0.; } } вернуть TmpEye; }(); }; интервал основной() { constexpr Mat Eye = InitEye(); constexpr Mat Eye2 = Wrapper::Eye; вернуть 0; } Самый близкий ответ, который я нашел, это этот (таким образом, лямбда-версия выше).
Однако живой пример показывает две проблемы:
[*]Версия без лямбда никогда не работает:
\:32:46: ошибка: 'static constexpr Mat Wrapper::WrappedInitEye()' вызывается в константном выражении до завершения его определения 32 | статический constexpr Mat Eye = WrappedInitEye(); [*]Версия Lambda также не работает в C++14 из-за отсутствия функции доступа constexpr для std::array Версия без лямбда-выражения выдает эту ошибку "неполное определение", потому что:
[*]constexpr инициализирует статический элемент с использованием статической функции [*]Функция static constexpr, вызванная в константном выражении, является... ошибкой?
Но все же, как я могу реализовать программную инициализацию std::array с помощью C++14?
Мне не удается программно инициализировать статический элемент constexpr std::array.
Это минимальный пример моей проблемы (для упрощения размер известен и мал, поэтому инициализация может быть ручной, но я бы хотел сделать фактический размер нетиповым параметром шаблона, тем самым исключая инициализацию вручную): #include constexpr std::size_t N = 3; используя Mat = std::array; // ОК, можно инициализировать свободный constexpr Mat constexpr Mat InitEye() noException { Мат TmpEye{0}; for (std::size_t r = 0; r < N; ++r) { for (std::size_t c = 0; c < N; ++c) { TmpEye[r * N + c] = (r == c) ? 1. : 0.; } } вернуть TmpEye; } // КО класс-оболочка { частный: // КО не может использовать его для инициализации статического члена constexpr static constexpr Mat WrappedInitEye() noException { Мат TmpEye{0}; for (std::size_t r = 0; r < N; ++r) { for (std::size_t c = 0; c < N; ++c) { TmpEye[r * N + c] = (r == c) ? 1. : 0.; } } вернуть TmpEye; } публика: статический constexpr Mat Eye = WrappedInitEye(); }; // также нокаут класс Обертка2 { публика: // ОК в C++17, но в C++17 все еще нокаут из-за отсутствия оператора доступа constexpr static constexpr Mat Eye = [] { Мат TmpEye{0}; for (std::size_t r = 0; r < N; ++r) { for (std::size_t c = 0; c < N; ++c) { TmpEye[r * N + c] = (r == c) ? 1. : 0.; } } вернуть TmpEye; }(); }; интервал основной() { constexpr Mat Eye = InitEye(); constexpr Mat Eye2 = Wrapper::Eye; вернуть 0; } Самый близкий ответ, который я нашел, это этот (таким образом, лямбда-версия выше).
Однако живой пример показывает две проблемы:
[*]Версия без лямбда никогда не работает:
\:32:46: ошибка: 'static constexpr Mat Wrapper::WrappedInitEye()' вызывается в константном выражении до завершения его определения 32 | статический constexpr Mat Eye = WrappedInitEye(); [*]Версия Lambda также не работает в C++14 из-за отсутствия функции доступа constexpr для std::array Версия без лямбда-выражения выдает эту ошибку "неполное определение", потому что:
[*]constexpr инициализирует статический элемент с использованием статической функции [*]Функция static constexpr, вызванная в константном выражении, является... ошибкой?
Но все же, как я могу реализовать программную инициализацию std::array с помощью C++14?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Инициализируйте каждый элемент std::array по ссылке на другой std::array.
Anonymous » » в форуме C++ - 0 Ответы
- 32 Просмотры
-
Последнее сообщение Anonymous
-