Rozumiem, że gdy obiekty są zwracane do wartości od funkcji, ich konstruktory kopiowania są wywoływane. Jeśli klasa ma usunięty konstruktor kopiowania, zwracanie przez wartość zakończy się niepowodzeniem.Dlaczego konstruktor kopiowania nie jest wywoływany, gdy zwracana wartość-wartość jest obiektem inicjowanym listą?
struct X {
X(const X &) = delete;
};
X f() {
return X{};
}
error: call to deleted constructor of 'X'
C++ 11 daje nam rozszerzonym inicjatorów. I czytałem gdzieś na SO zakładać, że ten
X f() {
return {};
}
jest taka sama jak
X f() {
return X{};
}
Więc dlaczego nie poniższy kod daje mi błąd? Przechodzi on i ja nawet dostać się do wywołania funkcji w głównym:
struct D {
D(const D &) = delete;
};
D f() { return {}; }
int main()
{
f();
}
Here is a demo. Nie jest błąd. Uważam, że to dziwne, ponieważ uważam, że powinien zostać wywołany konstruktor kopii. Czy ktoś może wyjaśnić, dlaczego nie podano błędu?
Co się stanie, jeśli usuniesz konstruktor ruchu? C++ 11 stwierdza, że będzie on używany, jeśli będzie dostępny. –
Co ciekawe, nie mogę uzyskać kodu do skompilowania na gcc 4.7.2 lub 4,8 migawki. [wersja demonstracyjna] (http://ideone.com/L94cwe). – juanchopanza
@ CrazyEddie Po usunięciu błędu pojawia się błąd. Wow, to było nieoczekiwane. Pamiętasz to jako odpowiedź? –