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

Если есть класс со стандартными и копирующими конструкторами

class Ex{
       //constructor definitions
}

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

void F(Ex _exin){...}

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

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

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

Ответы [ 2 ]

13 голосов
/ 10 декабря 2011

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

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

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; альтернативно, X (2) может быть построен в пространстве, используемом для хранения аргумент. /.../

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

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

2 голосов
/ 10 декабря 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...