Здравствуйте, regnar, Вы писали:
R>Можно ли 2015 году полагаться на NRVO, RVO и прочие элижены в современных компиляторах и возвращать стандартные контейнеры по значению? R>И чтобы без сюрпризов в виде проседания в неожиданных местах.
Сюрпризов не будет в любом случае (не считая, конечно, std::array), так как гарантированно сработает move. Но и сами copy/move elisions работают хорошо во всех современных компиляторах при включённых оптимизациях.
Кстати, где-то слышал, что в будущих версиях ISO copy/move elision могут сделать обязательными.
Но, даже учитывая это, иногда всё же выгоднее брать ссылку на выходной параметр, например если это vector — это позволит переиспользовать его capacity, уменьшая количество аллокаций.
Помимо этого бывают случаи где выходной параметр позволяет сделать код более обобщённым, например через OutputIterator.