Es scheint empirisch, dass C++ immer einen Listeninitialisierer über einen Wert Initialisierer bevorzugt. Meine Frage ist also, wie kann ich die Wertinitialisierung eines Typs erzwingen, der auch eine direkte Listeninitialisierung unterstützt. Hier ist ein minimales nicht-funktionierendes Beispiel:C++ 11 Wert Initialisierer vs Liste Initialisierer
#include <initializer_list>
using namespace std;
struct foo {
foo(int) {}
foo(initializer_list<char>) {}
};
struct bar {
foo f{256};
};
In diesem Beispiel würde ich f
wie initialisiert wird, um den Konstruktor foo(int)
statt den foo(initializer_list<char>)
. Sowohl GCC als auch Clang lehnen den Code jedoch ab, weil 256 für ein Zeichen zu groß ist, was bedeutet, dass die C++ - Spezifikation die Auswahl des Listeninitialisierers erfordert. Offensichtlich beseitigt das Auskommentieren des zweiten Konstruktors von foo
das Problem. Was ist der einfachste Weg, um bar
zu definieren, um Wert Initialisierung auf Feld f
zu verwenden? Im Idealfall könnte ich eine Kopie der Initialisierung f
vermeiden, da in meinem realen Beispiel kein Kopierkonstruktor existiert.
Update
Zur Klarstellung: natürlich ist es möglich f
explizit in jedem einzelnen Konstruktor bar
zu initialisieren. Aber meine Frage bezieht sich speziell auf die Member-Initialisierungssyntax, da es in Situationen mit einer großen Anzahl von Konstruktoren vorzuziehen ist, bestimmte Felder an einer Stelle zu initialisieren, anstatt den Code vollständig zu kopieren.
Einen Konstruktor schreiben? –
Schreiben Sie einfach 'foo f (256);'. –
Ich würde gerne eine Erklärung sehen, warum 'initializer_list' ist ein praktikabler Konstruktor für '{256}'. Es ist auch nicht sicher, auf der Grundlage des Compilerverhaltens auf die Spezifikation zu schließen. Manchmal bekommen mehrere Compiler dasselbe falsch. –