std::forward
Материал из cppreference.com
|
|
Эта страница была переведена автоматически с английской версии вики используя Переводчик Google.
Перевод может содержать ошибки и странные формулировки. Наведите курсор на текст, чтобы увидеть оригинал. Вы можете помочь в исправлении ошибок и улучшении перевода. Для инструкций перейдите по ссылке. Щёлкните здесь, чтобы увидеть английскую версию этой страницы |
| Определён в заголовочном файле <utility>
|
||
| template< class T > T&& forward( typename std::remove_reference<T>::type& t ); |
(1) | (начиная с C++11) |
| template< class T > T&& forward( typename std::remove_reference<T>::type&& t ); |
(2) | (начиная с C++11) |
При использовании в соответствии со следующим рецептом в шаблон функции, передает аргумента другой функции так, как он был принят в вызывающую функцию.
Оригинал:
When used according to the following recipe in a function template, forwards the argument to another function exactly as it was passed to the calling function.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Запустить этот код
template<typename T> wrapper(T&& arg) { foo(std::forward<T>(arg)); }
- Если вызов
wrapper()проходит RValuestd::string, тоTвыводится наstd::string(неstd::string&,const std::string&, илиstd::string&&), иstd::forwardгарантирует, что RValue ссылка передаетсяfoo.Оригинал:If a call towrapper()passes an rvaluestd::string, thenTis deduced tostd::string(notstd::string&,const std::string&, orstd::string&&), andstd::forwardensures that an rvalue reference is passed tofoo.Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. - Если вызов
wrapper()проходит константный именующееstd::string, тоTвыводится наconst std::string&, иstd::forwardгарантирует, что константный именующее ссылка передаетсяfoo.Оригинал:If a call towrapper()passes a const lvaluestd::string, thenTis deduced toconst std::string&, andstd::forwardensures that a const lvalue reference is passed tofoo.Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. - Если вызов
wrapper()проходит неконстантные именующееstd::string, тоTвыводится наstd::string&, иstd::forwardгарантирует, что неконстантные именующее ссылка передаетсяfoo.Оригинал:If a call towrapper()passes a non-const lvaluestd::string, thenTis deduced tostd::string&, andstd::forwardensures that a non-const lvalue reference is passed tofoo.Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Содержание |
[править] Заметки
Попытка направить RValue как именующее, например, путем создания экземпляра формы 2) с именующее ссылочного типа T, является ошибкой времени компиляции.
Оригинал:
Attempting to forward an rvalue as an lvalue, such as by instantiating the form 2) with lvalue reference type T, is a compile-time error.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
[править] Параметры
| t | — | объект, который будет направлен
Оригинал: the object to be forwarded Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. |
[править] Возвращаемое значение
static_cast<T&&>(t)
[править] Исключения
спецификация noexcept:
noexcept
[править] Пример
Этот пример демонстрирует идеальную передачу (perfect forwarding) аргумента функции make_unique1<T> в конструктор класса T. Также демонстрируется использование идеальной передачи параметров в вариативный шаблон.
Запустить этот код
#include <iostream> #include <memory> #include <utility> #include <array> struct A { A(int&& n) { std::cout << "rvalue overload, n=" << n << "\n"; } A(int& n) { std::cout << "lvalue overload, n=" << n << "\n"; } }; class B { public: template<class T1, class T2, class T3> B(T1&& t1, T2&& t2, T3&& t3) : a1_{std::forward<T1>(t1)}, a2_{std::forward<T2>(t2)}, a3_{std::forward<T3>(t3)} { } private: A a1_, a2_, a3_; }; template<class T, class U> std::unique_ptr<T> make_unique1(U&& u) { return std::unique_ptr<T>(new T(std::forward<U>(u))); } template<class T, class... U> std::unique_ptr<T> make_unique(U&&... u) { return std::unique_ptr<T>(new T(std::forward<U>(u)...)); } int main() { auto p1 = make_unique1<A>(2); // rvalue int i = 1; auto p2 = make_unique1<A>(i); // lvalue std::cout << "B\n"; auto t = make_unique<B>(2, i, 3); }
Вывод:
rvalue overload, n=2 lvalue overload, n=1 B rvalue overload, n=2 lvalue overload, n=1 rvalue overload, n=3
[править] Сложность
Константная.
[править] См. также
| (C++11) |
получает RValue ссылки Оригинал: obtains an rvalue reference Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (шаблон функции) |
| (C++11) |
получает ссылку на RValue, если перемещающий конструктор не бросает исключений Оригинал: obtains an rvalue reference if the move constructor does not throw Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (шаблон функции) |

