Описание тега forwarding-reference

Ссылка пересылки относится к ссылочному типу, который может быть либо ссылкой lvalue, либо ссылкой rvalue, в зависимости от его инициализатора. Они позволяют пользователю использовать идеальную пересылку. Этот термин применяется либо к параметру типа T&&, где T - тип параметра шаблона или auto, а также к локальным переменным auto&&.
2 ответа

Почему это не работает, когда lvalue-ref-arg и rvalue-ref-arg передаются как один и тот же тип forwarding-ref?

#include <type_traits> template<typename T> void f(T&& a, T&& b) {} int main() { int n; f(n, std::move(n)); } T&& является ссылочным типом переадресации, поэтому я думаю, decltype(a) должно быть int& а также d…
1 ответ

Ошибка C2783: "_Ty && std:: forward (remove_reference<_Ty>:: type &&) throw ()": не удалось вывести аргумент шаблона для "_Ty"

У меня есть шаблонная реализация параллельной очереди, которая имеет функцию push, которая выглядит следующим образом: template &lt;typename T&gt; class concurrent_queue { public: // other code... void push(const T&amp; item) { std::unique_lock&lt;s…
3 ответа

Синтаксис для универсальных ссылок

Это ссылка на значение: void foo(int&amp;&amp; a); Это не связывает с lvalues: int i = 42; foo(i); // error Это универсальная ссылка: template&lt;typename T&gt; void bar(T&amp;&amp; b); Он связывается с rvalues, а также с lvalues: bar(i); // okay Эт…
2 ответа

Пересылка ссылок и шаблонов

Рассмотрим эти две функции шаблона: template&lt;typename T&gt; void foo(T&amp;&amp; bar) { // do stuff with bar, which may or may not be an instance of a templated class } template&lt;typename U, template&lt;typename&gt; class T&gt; void foo(T&lt;U&…
1 ответ

Std::forward и шаблонный тип удержания

Я написал следующую небольшую программу, чтобы понять, как работает std:: forward. #include &lt;iostream&gt; #include &lt;memory&gt; template&lt;class T&gt; void foo3(T&amp;&amp; bar){ std::cout&lt;&lt;"foo3&amp;&amp;"&lt;&lt;std::endl; } template&l…
25 ноя '17 в 17:36
0 ответов

Всегда ли std::forward() используется в шаблонной функции?

Может кто-нибудь дать мне определение не шаблонной функции, показывающее явный вызов std::forward()? Я предполагаю, что параметр forward () всегда является (?) Универсальной ссылкой. Универсальная ссылка может быть объявлена ​​как "авто" auto&amp;&a…
3 ответа

Пересылка ссылок, квалификаторов ref и функций-членов шаблона

Возьмите следующую функцию-член: struct T { template &lt;typename X&gt; void f(X&amp;&amp; x) { /* ... */ } }; В этом случае, x является ссылкой для пересылки, потому что &amp;&amp; используется для параметров функции внутри шаблона. Это как и ожида…
1 ответ

Обязательный приоритет переадресации

Может кто-нибудь, пожалуйста, помогите мне понять, почему следующий код выводит T&amp;&amp; и не const A&amp;: class A{}; template&lt; typename T &gt; void foo( T&amp;&amp; ) { std::cout &lt;&lt; "T&amp;&amp;" &lt;&lt; std::endl; } void foo( const A…
29 окт '17 в 05:37
1 ответ

C++11 идеальная пересылка и свертывание ссылок

Рассмотрим этот код: template&lt;typename T&gt; void foo(T&amp;&amp; param){ //In this case &amp;&amp; is called universal reference std:string tmp = std::forward&lt;string&gt;(param); } У меня вопрос, если универсальный ссылочный тип может быть выв…
1 ответ

Почему std::move принимает ссылку на rvalue в качестве аргумента?

Согласно cppreference.com, move имеет подпись template&lt; class T &gt; typename std::remove_reference&lt;T&gt;::type&amp;&amp; move( T&amp;&amp; t ) noexcept; Почему требуется ссылка? T&amp;&amp; t как его аругмент? Также, когда я попробовал следую…
1 ответ

Ссылка на l-значение удержания шаблона функции и универсальная ссылка

Допустим, у меня есть функция copy: template &lt;typename Buf&gt; void copy( Buf&amp;&amp; input_buffer, Buf&amp; output_buffer) {} В котором input_buffer является универсальной ссылкой и output_buffer является ссылкой на значение l. Reference colla…
1 ответ

Различия в использовании std::enable_if и универсальных ссылок

Я пытаюсь понять универсальные ссылки и std::enable_if лучше, но я немного застрял в том, что здесь происходит в моем коде. Во-первых, я заметил, что люди, кажется, используют std::enable_if двумя разными способами: template&lt;typename T, std::enab…
4 ответа

Что auto&& говорит нам?

Если вы читаете код, как auto&amp;&amp; var = foo(); где foo любая функция, возвращаемая по значению типа T, затем var является lvalue типа rvalue ссылки на T, Но что это значит для var? Означает ли это, что мы можем украсть ресурсы var? Есть ли раз…
05 ноя '12 в 10:46
0 ответов

Обоснование универсальной эталонной функции шаблона является более жизнеспособным соответствием, чем не шаблонная функция?

Учитывая функцию-член шаблона (... шаблонный конструктор в шаблонном классе, как это происходит), принимающий универсальную переменную ссылку, и другую функцию-кандидат (в моем случае конструктор копирования), и GCC, и Clang выбирают универсальный ш…
2 ответа

Контроль с какими ссылками `T` связывает

Размышляя о том, что можно сделать, чтобы решить std::min Одна из проблем, с которыми я сталкивался, это добавление перегрузки (фактически 3 - для каждой комбинации) для r-значений, которые будут удалены. Проблема в том, что T&amp;&amp; будет ссылко…
3 ответа

Какое корректное ограничение `enable_if` для установщика совершенной пересылки?

Херб Саттер возвращается к основам! Основы презентации Modern C++ на CppCon обсуждали различные варианты передачи параметров и сравнивали их производительность с простотой написания / обучения. Опция 'advanced' (обеспечивающая наилучшую производител…
1 ответ

Как узнать, будет ли перемещен объект, переданный как r-значение?

Я передаю лямбда-функцию в функцию, которая принимает ее как ссылку на r-значение. Если моя лямбда определена в самом вызове функции, мне все равно, что будет с ней позже.Но если моя лямбда-переменная (скажем, я хочу использовать ее несколько раз), …
1 ответ

Пересылка ссылок и преобразование конструкторов в C++

Предположим, я хочу создать функцию, которая принимает строковые аргументы lvalue и rvalue по ссылке, преобразует их в верхний регистр и печатает их в стандартный вывод: void upper_print(std::string&amp; s); void upper_print(std::string&amp;&amp; s)…
2 ответа

auto&& переменные не являются ссылками на rvalue

Почему auto&& не является ссылкой на rvalue? Widget&amp;&amp; var1 = Widget(); // rvalue reference auto&amp;&amp; var2 = var1; //var2 not rvalue reference ниже приведен справочный пример void f(Widget&amp;&amp; param); // rvalue reference Widget&amp…
20 янв '16 в 12:03
2 ответа

Выведены конфликтующие типы для универсальной ссылки и указателя на член

Я хочу такую ​​функцию: template&lt;typename C, typename T&gt; void foo(C &amp;&amp;aclass, T (C::*const memberFunc)(unsigned)) { } Параметры (на словах, потому что синтаксис типа C/C++ является ментальным): Универсальная ссылка на класс, например M…
21 фев '18 в 14:07