Рассмотрим следующий код:
#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
Я знаю оптимизацию возвращаемого значения. Мой вопрос в том, какой вызов конструктора копирования исключен (временный объект при возврате или возвращаемый объект копируется в b)?
Если для создания b используется пропущенный конструктор копии, то как вообще создается b (потому что в этом случае также нет вызова конструктора)?
Если я заменю строку A b = a.fun(c);
на a.fun(c)
и скомпилирую с использованием первого метода или даже второго метода, то конструктор копирования также будет вызван 2 раза. Итак, если в случае, описанном в предыдущем абзаце, конструктор копии временного объекта опущен, то почему он не опускается в этом случае?
std::cout << "Copy constructor: " << (void*)b << " to " << (void*)this << std::endl;
иstd::cout << "Constructing " << (void*)this << std::endl
. Бонусные баллы за добавление ходов в C ++ 11. - person IdeaHat   schedule 14.11.2014