Según N2628 relacionado con c++0x, los inicializadores de miembros de datos no estáticos pueden anularse mediante constructores definidos explícitamente, pero parece ser ligeramente nebuloso con respecto al constructor de copia definido implícitamente.En C++ 0x, ¿los inicializadores de miembros de datos no estáticos anulan el constructor de copia implícito?
En particular, he notado que con Apple clang versión 3.0, el comportamiento varía dependiendo de si la estructura (o clase) es un POD.
El siguiente programa devuelve la salida "1", que indica que el constructor de copias ignora el lado derecho y sustituye el nuevo inicializador de miembros de datos no estáticos (en este ejemplo, el valor booleano verdadero para X :: a).
#include <iostream>
#include <string>
struct X
{
std::string string1;
bool a = true;
};
int main(int argc, char *argv[])
{
X x;
x.a = false;
X y(x);
std::cout << y.a << std::endl;
}
Sin embargo, confusamente, si comentar cabo cadena1:
// std::string string1;
trabaja entonces el comportamiento como esperaba (la salida es "0"), es de suponer que no, porque no se genera de forma implícita al constructor de copia y, por lo tanto, los datos son copiados.
¿La especificación C++ 0x realmente sugiere que es una buena idea permitir que el constructor de copias definido implícitamente no copie el contenido del lado derecho? ¿No es menos útil y poco intuitivo? Encuentro que la funcionalidad del inicializador de miembros no estáticos es bastante conveniente, pero si este es el comportamiento correcto, entonces evitaré explícitamente la función debido a su comportamiento engañoso y poco intuitivo.
Por favor, dime que estoy equivocado?
ACTUALIZACIÓN: Este error se ha solucionado en el repositorio fuente de Clang. Vea esto revision.
ACTUALIZACIÓN: Este error aparece fijo en Apple clang versión 3.1 (etiquetas/Apple/clang-318.0.45) (basado en LLVM 3.1svn). Esta versión de clang se distribuyó como parte de Xcode 4.3 para Lion.
+1 for nebulosity –