2

Учитывая следующий C++ код:Будет ли выполняться копирование конструктора для этого кода?

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

const foo &getData(); 

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

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

+1

Этот вопрос имеет смысл, если 'alt1' и' alt2' не были ссылками. –

ответ

5

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

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

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

2

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

0

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