Ветвь с if constexpr() для переменных constinit?
В следующем коде я пытаюсь создать структуру данных constexpr, а затем использовать один из инициализированных элементов constexpr () в методе для ветвления с помощьюif constexpr()
.
С логической точки зрения AFAIK ничего не говорит против этого: конечно, расположение памяти известно только во время выполнения, поэтому указатель this, переданный методу, будет известен только во время выполнения. Однако удаление ветки constexpr может быть выполнено до того, как данные constexpr будут записаны в двоичный файл, компилятор может сделать еще один ход и constexpr исключить одну из ветвей, потому чтоa_
известен для каждой структуры. Конечно, это означало бы, что компилятор генерирует инструкции для нескольких методов, по одной для каждой ветви.
Я ошибаюсь или в этом отделе не хватает компиляторов?
(Ошибочно) Демонстрация
#include <array>
#include <initializer_list>
#include <cstdio>
#include <algorithm>
struct channel
{
constexpr channel(int a)
: a_{a}
{}
constexpr void compile_time_decide() const {
if constexpr (a_ > 5) {
printf("Decided at compile time!\n");
} else {
printf("Decided at compile time!\n");
}
}
const int a_;
};
template <size_t N>
struct light_service
{
constexpr light_service(std::array<channel, N> channels)
: channels_{channels}
{ }
void runtime_invoke() {
std::for_each(channels_.begin(), channels_.end(), [](channel& ch){ ch.compile_time_decide(); });
}
std::array<channel, N> channels_;
};
constinit light_service<10> light{{1,2,3,4,5,6,7,8,9,10}};
int main()
{
light.runtime_invoke();
}