In base a N2628 relativo a c++0x, gli inizializzatori di membri di dati non statici possono essere sostituiti da costruttori definiti in modo esplicito, ma sembra essere leggermente nebuloso riguardo al costruttore di copie implicitamente definito.In C++ 0x, gli inizializzatori dei membri dei dati non statici sostituiscono il costruttore implicito di copia?
In particolare, ho notato che con la versione 3.0 di Apple clang, il comportamento varia a seconda che la struct (o la classe) sia un POD.
Il seguente programma restituisce l'output "1", che indica che il costruttore di copia sta ignorando il lato destro e sostituisce invece il nuovo inizializzatore di membro dati non statici (in questo esempio, il valore vero booleano per 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;
}
Tuttavia, confusamente, se si commento fuori string1:
// std::string string1;
allora il comportamento funziona come mi aspettavo (l'uscita è "0"), costruttore di copia, presumibilmente perché non c'è modo implicito generato e quindi i dati sono copiati.
La specifica C++ 0x suggerisce davvero che sia una buona idea consentire al costruttore di copie implicitamente definito di non copiare il contenuto del lato destro? Non è meno utile e non intuitivo? Trovo che la funzionalità di inizializzazione dei membri non statici sia abbastanza comoda, ma se questo è il comportamento corretto, eviterò esplicitamente la funzione a causa del suo comportamento complicato e non intuitivo.
Per favore dimmi che mi sbaglio?
UPDATE: questo errore è stato corretto nel repository di origine Clang. Vedi questo revision.
AGGIORNAMENTO: Questo bug appare corretto in Apple clang versione 3.1 (tag/Apple/clang-318.0.45) (basato su LLVM 3.1svn). Questa versione di clang è stata distribuita come parte di Xcode 4.3 per Lion.
+1 per nebulosità –