Передача временного объекта в качестве параметра по значению - вызван ли конструктор копирования?

Если a имеет класс с как стандартными, так и конструкторами копирования

class Ex{
       //constructor definitions
}

и функцию, которая принимает ее как аргумент (по значению)

void F(Ex _exin){...}

возьмите следующий фрагмент кода:

Ex A;
F(A);   //F parameter is copy constructed from A
F(Ex());  //F parameter uses the default constructor

В третьей строке я передаю F новый (временный) объект класса Ex, используя конструктор по умолчанию. Мой вопрос: после того, как этот новый объект создан, он также скопирован/назначен (как это происходит во второй строке) или он непосредственно создается "внутри" F?

Ответ 1

Трудно было найти, но, честно говоря, это меня исказило. Это называется разрешением конструктора экземпляра.

Стандарт иллюстрирует этот пример:

class X{
public:
   X(int);
   X(const X&);
   ~X()
};

X f(X);

void g()
{
   X a(1);
   X b = f(X(2)); //identical to what you have:
   a = f(a);
}

И в нем говорится:

12.2/2 Временные объекты

Здесь реализация может использовать временную структуру X (2), прежде чем передать его в f(), используя X copy-constructor; альтернативно, X (2) может быть построено в пространстве, используемом для аргумент. /.../

После этого стандарт объясняет оптимизацию возвращаемого значения, что в основном одно и то же.

Таким образом, это фактически не имеет никакого отношения к наблюдаемому поведению, это зависит от компилятора.

Ответ 2

он должен вызывать конструктор и конструктор-копир

Оптимизаторы

могут удалить ненужное копирование