Inesperado no constante std :: initializer_list
Estaba jugando un poco con el truco de los índices para ver a dónde podía ir y me encontré con un extraño error ... Primero, los índices no tan viejos y llanos:
template<std::size_t...>
struct indices {};
template<std::size_t N, std::size_t... Indices>
struct make_indices:
make_indices<N-1, N-1, Indices...>
{};
template<std::size_t... Indices>
struct make_indices<0, Indices...>:
indices<Indices...>
{};
He creado una clase de matriz de tiempo de compilación derivada de unastd::initializer_list
y lo tenía indexable (asume queN3471 Es el soporte de tu compilador. Estará en la próxima norma de todos modos). Aquí está:
template<typename T>
struct array:
public std::initializer_list<T>
{
constexpr array(std::initializer_list<T> values):
std::initializer_list<T>(values)
{}
constexpr auto operator[](std::size_t n)
-> T
{
return this->begin()[n];
}
};
Así que traté de crear una función que devuelve una copia de unarray
Después de haber agregado 1 a cada uno de sus miembros:
template<typename T, std::size_t... I>
auto constexpr add_one(const array<T>& a, indices<I...>)
-> const array<T>
{
return { (a[I]+1)... };
}
Y para terminar con el código, aquí está mi principal:
int main()
{
constexpr array<int> a = { 1, 2, 3 };
constexpr auto b = add_one(a, make_indices<a.size()>());
return 0;
}
No pensé que el código se compilara de todos modos, pero estoy bastante sorprendido por el mensaje de error (Aquí está elideone código):
In function 'int main()':
error: 'const smath::array<int>{std::initializer_list<int>{((const int*)(& const int [3]{2, 3, 4})), 3u}}' is not a constant expression
Entonces, ¿podría alguien explicarme qué no es lo suficientemente constante para el compilador en el código anterior?
EDITAR: Seguimiento de esa pregunta.
¿Es legal declarar un objeto constexpr std :: initializer_list?Confusión sobre la expresión constante.