Краткая версия: Общепринято возвращать большие объекты, такие как векторы/массивы, во многих языках программирования. Является ли этот стиль приемлемым в С++ 0x, если класс имеет конструктор перемещения или программисты на С++ считают его странным/уродливым/мерзостью?
Длинная версия: В С++ 0x это все еще считается плохой формой?
std::vector<std::string> BuildLargeVector();
...
std::vector<std::string> v = BuildLargeVector();
Традиционная версия будет выглядеть так:
void BuildLargeVector(std::vector<std::string>& result);
...
std::vector<std::string> v;
BuildLargeVector(v);
В новой версии значение, возвращаемое из BuildLargeVector
, является rvalue, поэтому v будет построено с использованием конструктора перемещения std::vector
, предполагая, что (N) RVO не выполняется.
Даже до С++ 0x первая форма часто была бы "эффективной" из-за (N) RVO. Однако (N) RVO находится по усмотрению компилятора. Теперь, когда у нас есть ссылки rvalue, гарантируется отсутствие глубокой копии.
Изменить: вопрос действительно не о оптимизации. Обе представленные формы имеют почти идентичную производительность в реальных программах. Принимая во внимание, что в прошлом первая форма могла иметь худшие показатели по порядку величины. В результате первая форма была основным запахом кода в программировании на С++ в течение длительного времени. Надеюсь, не больше?