enclosed - c++ initialization list
CppCon 2018, Nicolai Josuttis: ¿Por qué se interpretan como iteradores? (1)
La presentación de "La pesadilla de la inicialización en C ++" de Nicolai Josuttis en CppCon 2018 tuvo, en un momento dado, el siguiente código:
std::vector< std::string > v07 = {{ "1", "2" }};
Nicolai dijo lo siguiente (la mía de la transcripción):
El problema es que lo que sucede aquí es que interpretamos estos dos parámetros como iteradores . Así que estos son iteradores, así que este es el comienzo del rango, y este es el final del rango, y deben referirse al mismo rango de caracteres ; porque los caracteres se convierten implícitamente en cadenas, esto se compilará. Si tienes suerte, tendrás un coredump. Si no, tienes un gran problema.
Él me perdió allí. ¿Alguien puede explicar qué está pasando aquí, exactamente, paso a paso?
Debajo del codigo
std::vector< std::string > v07 = { { "1", "2" } };
es equivalente a
std::string s = {"1","2"}; // call string(const char*, const char*)
std::vector<std::string> v07 = {s}; // initializer list with one item
el problema es con
s={"1","2"};
Esto llama al string(const char* start, const char* end)
, pero start
y end
deben referirse al mismo objeto string. "1" y "2" son dos objetos diferentes, por lo que conduce a UB.