Мне интересно, если в C ++ 0x "12.8 Копирование и перемещение объектов класса [class.copy] параграф 31" , когда copy elision происходит, точно:
При соблюдении определенных критериев реализация может опустить конструкцию копирования / перемещения объекта класса [...].Такое исключение операций копирования / перемещения, называемое разрешением копирования, допускается в следующих случаях [...]:
- в операторе возврата в функции с типом возврата класса, когда выражение являетсяимя энергонезависимого автоматического объекта [...] с тем же типом cv-unqualified, что и тип возвращаемого функцией, операция копирования / перемещения может быть опущена путем создания автоматического объекта непосредственно в возвращаемое значение функции
- [...]
А теперь мне интересно, позволяет ли это в следующем коде ускользнуть от копирования
vector<string> gen(const char *fn) {
if(fn == nullptr) // this should prevent RVO
return {"House", "Horse", "Hen"};
vector<string> res;
fillFromFile(res, fn);
return res; // copy elision possible?
}
int main() {
vector<string> data = gen("users.dat");
}
ИлиРазве это правило не для примера, и я должен сделать это явно?
return move(res); // explicitly prevent copy
Обратите внимание, что мое намерение if
состояло в том, чтобы устранить очевидное Возвращаемое значениеОптимизация (RVO).
Или я совершенно не на том пути?Произошло изменение, включающее return
и move , которые могли бы использовать rvalue ссылок , верно?