c++ - studio - initializer_list con auto contiene múltiples expresiones
visual studio installer (1)
La regla de la deducción de auto tipo cambió desde C ++ 17.
(desde C ++ 17)
En la inicialización de la lista directa (pero no en la copia de la lista-inicialización), al deducir el significado del auto de una lista de iniciados, la lista de init debe contener solo un elemento, y el tipo de auto Ser el tipo de ese elemento:
auto x1 = {3}; // x1 is std::initializer_list<int> auto x2{1, 2}; // error: not a single element auto x3{3}; // x3 is int // (before C++17 x2 and x3 were both std::initializer_list<int>)
Entonces, antes de C ++ 17, todas las variables en su muestra funcionan bien y tienen el tipo std::initializer_list<int>
. Pero como C ++ 17, para la inicialización directa (es decir, para x11
y x22
), el inicializador reforzado debe contener solo un elemento (y su tipo sería el tipo del elemento) y luego se convertirá en un código mal formado.
Pregunta bastante simple,
auto x11 {1,2,3,4};
auto x1 = {1,2,3,4};
auto x22 {1.0, 2.25, 3.5};
auto x2 = {1.0, 2.25, 3.5};
Por lo que yo entiendo, no debería haber ninguna diferencia aquí con respecto a tener =
o no. Sin embargo, al usar llvm / clang 6.0.0 (con --std = c ++ 17), obtengo:
main1.cpp:35:17: error: initializer for variable ''x11'' with type ''auto'' contains multiple
expressions
auto x11 {1,2,3,4};
~~~~~~~~ ^
main1.cpp:37:20: error: initializer for variable ''x22'' with type ''auto'' contains multiple
expressions
auto x22 {1.0, 2.25, 3.5};
Del libro de C ++ de Stroustroup, página.162:
auto x1 {1,2,3,4}; // x1 is an initializer_list<int>
auto x2 {1.0, 2.25, 3.5 }; // x2 is an initializer_list of<double>
Entonces, ¿hay realmente un problema en no tener = dentro?