Недавний вопрос заставил меня задаться вопросом о явных конструкторах копирования. Вот пример кода, который я пытался скомпилировать в 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 с той же ситуацией, и таинственный комментарий от основной функции: "c копируется" (как если бы это было очевидно). Как указал Оли Чарлворт: gcc не компилирует этот код, и я считаю, что он не хочет этого делать.