Недавний вопрос заставил меня задаться вопросом о явных конструкторах копирования. Вот пример кода, который я пытался компилировать под Visual Studio 2005:Явное поведение конструктора копирования и практическое использование
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;
}
Теперь вопросы:
- ли # 2 разрешено стандартом? Если да, то каков соответствующий раздел, описывающий эту ситуацию?
- Известно ли вам какое-либо практическое применение для явного конструктора копирования?
[EDIT] я нашел забавную ссылку на MSDN с точно такой же ситуацией, и загадочный комментарий от основной функции: «с скопирован» (как если бы это было очевидно). Как указал Оли Чарлворт: gcc не компилирует этот код, и я считаю, что он прав.
Я не считаю, что явные конструкторы копирования - хорошая идея. Где вы читали о них? – fredoverflow
Это, похоже, исправлено в VC++ 2010 - это дает ошибку для строки 'passByValue (a);'. – user200783