@john-0 sagte in Wie definiert man eine constexpr std::initializer_list?:
@Columbo sagte in Wie definiert man eine constexpr std::initializer_list?:
struct X {
// garantiert, dass der assert einen Uebersetzungsfehler produziert
consteval X(std::initializer_list<int> arr) { assert(arr.size() == 4); }
};
int main() {
X x{1, 2, 3}; // Fehler
}
```
Das funktioniert gar nicht, da assert keinen konstanten Ausdruck zurückliefert,d .h. es schlägt immer fehl und nicht nur wenn die falsche Anzahl Objekte enthalten ist. Für consteval muss man static_assert verwenden, und das geht nicht, weil der Compiler ein temporäres Objekt erzeugt. D.h. zurzeit kann man keinen Konstruktor schreiben, der wirklich zum Übersetzungszeitpunkt eine initializer_list erhält und zum Übersetzungszeitpunkt daraus ein constexpr Objekt macht.
Falsch. Keine Ahnung wie Du ueberhaupt darauf kommst, Du hast den Code offensichtlich nicht mal getestet (https://coliru.stacked-crooked.com/a/53c9a90bfbb4a423). Das hat in der Praxis schon immer funktioniert und seit C++17 garantiert, was consteval sowieso erfordert.
Edit: Wahrscheinlich hast Du den static_assert in Deinem Code durch assert ersetzt, das Schlug fehl weil die Laenge der Liste 1 ist, aber du hast faelschlicherweise deduziert, dass es am fehlenden constexpr von __assert_fail liegt
Guck mal hier: https://coliru.stacked-crooked.com/a/51003882390b9d36