#include <iostream>
using namespace std;
class Y {
public:
Y(int) {
cout << "Y(int)\n";
}
Y(const Y&) {
cout << " Y(const Y&)\n";
}
};
int main() {
Y obj1 = 2; // Line 1
}
Выход: Y (целое)Почему конструктор копирования не вызывается, чтобы скопировать временный объект на новый определенный объект
Ожидаемый результат: Y (целое) Y (Const Y &)
Вопрос> Основываясь на моем понимании, строка 1 сначала создаст временный объект Y (2), а затем назначит временному объекту obj1
. Таким образом, я ожидаю, что вызываются как Y(int)
, так и Y(const Y&)
. Но вывод vs2010 сообщает только первый (то есть Y(int)
). Зачем?
См. Ответ Стефано для дальнейшего обсуждения (Энди правильно). «Явный», вызывающий ошибку, означает, что они никоим образом не эквивалентны. – chris
Инициализация копирования не эквивалентна прямой инициализации. Первый концептуально достигается путем создания временного из инициализирующего выражения ('2'), а затем перемещение-построение или копирование' obj1' из этого временного. Тем не менее, компилятору разрешено выполнять этот вызов конструктору перемещения или конструктору копирования в 12.8/31 (см. Мой ответ) –