c++ - hashtracking - Valorar la inicialización de un objeto automático?
hashtags facebook 2018 (3)
Escribo una clase de plantilla y en un punto de mi código me gustaría poder inicializar el valor de un objeto del tipo parametrizado en la pila. En este momento, estoy logrando esto escribiendo algo para este efecto:
template <typename T> void MyClass<T>::doSomething() {
T valueInitialized = T();
/* ... */
}
Este código funciona, pero (a menos que el compilador sea inteligente) requiere una creación y destrucción innecesarias del objeto T
temporal. Lo que me gustaría escribir es lo siguiente, que sé que es incorrecto:
template <typename T> void MyClass<T>::doSomething() {
T valueInitialized(); // WRONG: This is a prototype!
/* ... */
}
Mi pregunta es si existe una buena forma de inicializar el valor del objeto automático sin tener que construir explícitamente un objeto temporal y asignarlo al objeto automático. Se puede hacer esto? O es T var = T();
¿Mejor imposible?
Lo siguiente usa la inicialización de la copia , que es ''probablemente bueno'' el 95% del tiempo en C ++ 03:
T var = T();
Pero para el código genérico C ++ 03, siempre debe preferir la inicialización directa para dar cuenta de ese otro 5%:
T var((T())); // extra parentheses avoid the most vexing parse – the extra parentheses
// force the contents to be evaluated as an expression, thus implicitly
// *not* as a declaration.
O mejor aún, usa el Boost . Biblioteca Utility.ValueInit , que empaqueta el comportamiento ideal para usted junto con soluciones para diversas deficiencias del compilador (lamentablemente, más de lo que uno podría pensar):
boost::value_initialized<T> var;
Para C ++ 11, se puede usar la sintaxis de inicialización de lista para lograr una inicialización de valor directa de una manera significativamente menos ruidosa / fea:
T var{}; // unambiguously value-initialization*
(* Nb esto es solo inicialización de valor para tipos que no tienen un constructor unario tomando std::initializer_list<>
; para los tipos que lo hacen, ese constructor se llamará en su lugar - "inicialización uniforme" de hecho ... Por supuesto, el resultado neto debería ser el mismo para los tipos sanos).
No, no hay otra forma de inicializar de forma confiable un tipo de plantilla en C ++ 03.
Si puede contar con que T
solo son tipos de clase con constructores predeterminados, simplemente podría escribir
T valueInitialized;
pero si T
podría ser un tipo incorporado,
T valueInitialized = T();
es el camino a seguir.
¿Tiene alguna razón para no confiar en su compilador para optimizar esa copia?
Puede usar llaves en C ++ 0x:
T valueInitialized{};