Будет ли запущен конструктор копирования для этого кода? - PullRequest
2 голосов
/ 10 января 2012

Учитывая следующий код C ++:

struct foo {
  // Some definition with copy constructor.
};

const foo &getData();

const foo &alt1(getData());
const foo &alt2 = getData();

Будет ли разумный компилятор производить другой код для alt1 и alt2?Другими словами, alt1 вызовет запуск конструктора копирования, или компилятору позволено оптимизировать это и назначить ссылку напрямую?

Ответы [ 4 ]

5 голосов
/ 10 января 2012

В обоих случаях вы инициализируете ссылку (не объект), поэтому не будет запущен конструктор копирования.

2 голосов
/ 10 января 2012

Нет. В вашем коде alt1 и alt2 являются ссылками на объект, возвращаемый из getData(). Таким образом, для начала не будет создано ни одного объекта, поэтому нет и вопроса о вызове конструктора копирования.

2 голосов
/ 10 января 2012
const foo &alt1(getData());
const foo &alt2 = getData();

Эти два абсолютно одинаковы. Здесь нет ни одной копии с оптимизацией или без нее.

0 голосов
/ 12 января 2012

Просто для завершения этих ответов, если подпись getData () была "foo getData ();"тогда вам понадобится конструктор копирования, чтобы выйти и быть доступным, даже если большинство компиляторов не генерируют к нему никакого вызова.

...