Мне интересно, если в 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, верно?