visual studio microsoft español descargar community c++ language-lawyer c++17 auto

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.

Ver N3922 y N3681 para más.

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?