Der folgende Code braucht dringend : values()
, zumindest in ideone zu kompilieren :: C++ 14:Warum muss ich ein nicht-statisches Array-Mitglied in einer Constexpr-Klasse initialisieren?
#include <iostream>
template<int N>
struct Table
{
constexpr Table() : values()
{
for (auto i = 0; i < N; ++i)
{
values[i] = i * i * i;
}
}
int values[N];
};
int main() {
constexpr auto a = Table<1000>();
for (auto x : a.values)
std::cout << x << '\n';
}
Aber warum? Ich hatte Gedanken entlang "Werte könnten auch in einer nicht-consExpr-Weise initialisiert werden und Werte() sagen explizit, dass wir sie in einer consExpr-konformen Weise initialisieren". Aber nicht : values()
genauso klar weglassen?
'clang' gibt eine seltsame Nachricht:' Zuordnung zu einem Objekt außerhalb seiner Lebensdauer ist nicht erlaubt in einem konstanten Ausdruck 'für die' = 'im Konstruktor von' Table' wenn ich 'values ()' weglasse. – Holt
"Für den Konstruktor einer Klasse oder Struktur muss jedes Basisklassenunterobjekt und jeder nichtvariable nicht statische Datenmember initialisiert werden." – krOoze
Aber es ist sowieso initialisiert, nur nicht explizit in jedem Fall. Es funktioniert für Nicht-Constexpr-Klassen – IceFire