Код: Выделить всё
template
T&& wrapper(T&& t) {
f(t); // t passed as lvalue
return std::forward(t);
}
Код: Выделить всё
fСпорно, должна ли оболочка() возвращать void или T&&, поскольку вызывающая сторона имеет доступ к оцененному значению через arg ( что является ссылкой, R или L). Но в моем случае мне нужно вернуть значение, чтобы можно было использовать в выражениях обертку().
Возможно, это не имеет отношения к вопросу, но известно, что функции f не крадут функции t, поэтому первое использование std: :forward в f(std::forward(t)) является излишним и был мной удален.
I' Я написал небольшой тест: https://gist.github.com/3910503
Тест показывает, что возврат неперенаправленного T- создает дополнительную копию в gcc48 и clang32 с -O3 (RVO не срабатывает).
Кроме того, мне не удалось добиться плохого поведения от UB в:
Код: Выделить всё
auto&& tmp = wrapper(42);
Подробнее здесь: https://stackoverflow.com/questions/129 ... -is-needed
Мобильная версия