programacion - que es un array en c++
Empujando hacia atrĂ¡s la cuerda al vector de objetos (3)
Class Foo
tiene un ctor no explícito que toma un argumento de tipo std::string
(es decir, Converting constructor ), lo que significa que puede ser implícitamente lanzado desde std::string
.
f.push_back(str); // implicit casting from std::string to Foo
f.push_back(Foo(str)); // explicit casting from std::string to Foo
Tenga en cuenta que si hace que el ctor sea explicit
, el lanzamiento implícito será prohibido.
class Foo {
public:
explicit Foo(std::string s) : _s(s) {}
// ~~~~~~~~
private:
std::string _s;
};
y entonces
f.push_back(str); // invalid now
f.push_back(Foo(str)); // still valid
Estaba buscando un código que escribí para un proyecto escolar, que en una inspección más cercana me pareció extraño. Tenía una clase similar a la siguiente:
class Foo {
public:
Foo(std::string s) : _s(s) {}
private:
std::string _s;
};
int main() {
std::string str = "Hiyo";
std::vector<Foo> f;
f.push_back(str); // Compiles. Weird to me though.
f.push_back(Foo(str)); // Predictably, this compiles as well.
return 0;
}
¿Por qué la primera llamada a push_back
una declaración válida, aunque str
no es un Foo
?
Creo que en el primer retroceso automáticamente se inicializa Foo(str)
Así que básicamente es lo mismo!
El primer push back inicializará automáticamente un objeto Foo
dado un objeto string
; a través de su lista de inicializadores.
(Espera un objeto Foo
, obtiene una cadena: ¿puede inicializarse un objeto Foo
con una sola cadena? Sí, su lista de inicializadores tiene un solo elemento y el objeto se inicializa desde ese elemento).
Para detalles, ver por ejemplo: