Ostatnie pytanie sprawiło, że zastanawiałem się nad konstruktorami jawnych kopii. Oto przykładowy kod, który Próbowałem kompilacji pod Visual Studio 2005:Jawne zachowanie konstruktora kopiowania i praktyczne zastosowania
struct A
{
A() {}
explicit A(const A &) {}
};
// #1 > Compilation error (expected behavior)
A retByValue()
{
return A();
}
// #2 > Compiles just fine, but why ?
void passByValue(A a)
{
}
int main()
{
A a;
A b(a); // #3 > explicit copy construction : OK (expected behavior)
A c = a; // #4 > implicit copy construction : KO (expected behavior)
// Added after multiple comments : not an error according to VS 2005.
passByValue(a);
return 0;
}
Teraz pytania:
- to # 2 dozwolony przez normę? Jeśli tak, to jaka jest odpowiednia sekcja opisująca tę sytuację?
- Czy znasz jakieś praktyczne zastosowanie dla konstruktora jawnej kopii?
[EDIT] Właśnie znalazłem zabawny link na MSDN z dokładnie tej samej sytuacji, a tajemniczy wpis z głównych funkcji: „c jest kopiowany” (jakby to było oczywiste). Jak wskazał Oli Charlesworth: gcc nie kompiluje tego kodu i uważam, że nie ma racji.
Nie myślę, że konstruktorzy jawnych kopii to dobry pomysł. Gdzie o nich czytałeś? – fredoverflow
To wydaje się być poprawione w VC++ 2010 - daje błąd dla linii 'passByValue (a);'. – user200783