Пересылка возвращаемых значений. Нужен ли std::forward?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Пересылка возвращаемых значений. Нужен ли std::forward?

Сообщение Anonymous »

Я пишу библиотеку, которая включает в себя множество функций и методов из другой библиотеки. Чтобы избежать обработки возвращаемых значений, я применяю std::forward следующим образом:

Код: Выделить всё

template
T&& wrapper(T&& t) {
f(t);  // t passed as lvalue
return std::forward(t);
}
возвращает void и принимает T&& (или перегружается по значению). Оболочка всегда возвращает параметр оболочки, а возвращаемое значение должно сохранять значение аргумента. Действительно ли мне нужно использовать std::forward в ответ? Делает ли RVO это излишним? Делает ли его излишним тот факт, что это ссылка (R или L)? Нужно ли это, если return не является последним оператором функции (внутри некоторого if)?

Спорно, должна ли оболочка() возвращать 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);
Это не доказывает никакой причины, поскольку это неопределенное поведение (если это UB).

Подробнее здесь: https://stackoverflow.com/questions/129 ... -is-needed
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»