Warum leitet auto x {3} eine initializer_list ab?

Ich liebeauto in C ++ 11. Es ist wunderbar. Aber es hat eine Inkonsistenz, die mir wirklich auf die Nerven geht, weil ich die ganze Zeit darüber stolpere:

int i = 3;       // i is an int with value 3
int i = int{3};  // i is an int with value 3
int i(3);        // i is an int with value 3 (possibly narrowing, not in this case)
int i{3};        // i is an int with value 3

auto i = 3;      // i is an int with value 3
auto i = int{3}; // i is an int with value 3
auto i(3);       // i is an int with value 3
auto i{3};       // wtf, i is a std::initializer_list<int>?!

Dieses seltsame Verhalten ist für Neulinge verwirrend und für erfahrene Benutzer ärgerlich - C ++ weist genug kleine Inkonsistenzen und Eckfälle auf, die man so wie es ist im Hinterkopf behalten muss. Kann jemand erklären, warum das Normungskomitee beschlossen hat, in diesem Fall ein neues einzuführen?

ch könnte es verstehen, wenn ich eine Variable vom Typ @ deklariestd::initializer_list war etwas, das nützlich war oder häufig gemacht wurde, aber meiner Erfahrung nach ist es fast nie beabsichtigt - und in den seltenen Fällen, in denen Sie es wollte

std::initializer_list<int> l{3};
auto l = std::initializer_list<int>{3};
auto l = {3}; // No need to specify the type

würde gut funktionieren. Also, was ist der Grund für den Sonderfall fürauto x{i}?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage