Рассмотрим следующий код:конструктор копирования не вызывается при инициализации объекта с обратным значением функции
#include <iostream>
using namespace std;
class A
{
public:
int a;
A(): a(5)
{
cout << "Constructor\n";
}
A(const A &b)
{
a = b.a;
cout << "Copy Constructor\n";
}
A fun(A a)
{
return a;
}
};
int main()
{
A a, c;
A b = a.fun(c);
return 0;
}
Выход указанного выше кода с g++ file.cpp
составляет:
Constructor
Constructor
Copy Constructor
Copy Constructor
Выходной сигнал выше код с g++ -fno-elide-constructors file.cpp
является:
Constructor
Constructor
Copy Constructor
Copy Constructor
Copy Constructor
Я знаю, что возвращаемое значение Optimiz ция. Мой вопрос в том, какой вызов вызывает копирование конструктора (временный объект при возврате или возвращенный объект, скопированный в b)?
Если конструктор с включенной копией является тем, который используется для создания b, то как вообще создается b (потому что в этом случае также нет вызова конструктора)?
Если я заменю строку A b = a.fun(c);
на a.fun(c)
и скомпилирую с использованием первого метода или даже второго метода, то и конструктор копирования вызывается 2 раза. Итак, если в случае, описанном в предыдущем абзаце, конструктор копирования временного объекта удаляется, то почему в этом случае он не отклоняется?
Как рассмотрел этот материал, когда я узнал об этом, это был «std :: cout <<» Копировальный конструктор: «<< (void *) b <<" to "<< (void *) this << std :: endl;' , и 'std :: cout <<« Построение »<< (void *) этого << std :: endl'. Бонусные точки, если вы добавляете ходы в C++ 11. – IdeaHat