По умолчанию все в C / C ++ передается по значению, включая тип возвращаемого значения, как в примере ниже:
T foo() ;
В C ++, где типы обычно считаются типами-значениями (т.е. ониведут себя как типы int
или double
), дополнительная копия может быть дорогостоящей, если создание / уничтожение объекта не является тривиальным.
С C ++ 03
Если вы хотите вернутьпо ссылке или по указателю вам нужно изменить тип возвращаемого значения:
T & foo() ; // return a reference
T * foo() ; // return a pointer
, но в обоих случаях необходимо убедиться, что возвращаемый объект все еще существует после возврата ,Например, если возвращенный объект был размещен в стеке в теле функции, объект будет уничтожен, и, следовательно, его ссылка / указатель будет недействительной.
Если вы не можете до сих пор гарантировать объектсуществует после возврата, ваше единственное решение - либо:
- принять стоимость дополнительной копии, и надеяться на Оптимизацию возвращаемого значения
- проход вместопеременная по ссылке в качестве параметра функции, как показано ниже:
void foo(T & t) ;
Таким образом, внутри функции вы устанавливаете значение t
по мере необходимостии после возврата из функции у вас есть результат.
С C ++ 11
Теперь, если у вас есть возможность работать с C ++ 0x / C ++ 11, тос компилятором, который поддерживает r-значения, ссылки / семантика перемещения , если ваш объект имеет правильный конструктор / оператор (если ваш объект взят из стандартной библиотеки, тогда все в порядке), тогда дополнительная временная копиябудет оптимизирован, и вы могли быи сохраните запись:
T foo() ;
Зная, что компилятор не сгенерирует ненужное временное значение.