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

Универсальная ссылка относится к ссылочному типу, который может быть либо ссылкой lvalue, либо ссылкой rvalue в зависимости от ее инициализатора. Они позволяют пользователю использовать совершенную пересылку.
1 ответ

Превратите литье / конструкцию в идеальную передовую функцию

SSCCE: #include <functional> using std::function; using std::forward; template<typename ToType, typename... FromTypes> ToType construct(FromTypes&&... fromTypes) { return ToType(forward<FromTypes>(fromTypes)...); } class Ma…
3 ответа

Поведение шаблонной функции C++

Допустим, у меня есть эта функция: bool f(int&& one, int&& two) { } Если я попытаюсь позвонить с этим кодом: int x = 4; f(x, 5); компилятор будет жаловаться, что не может преобразовать x из ссылки lvalue в ссылку rvalue, что является…
03 окт '13 в 07:24
2 ответа

Универсальная ссылка в конструкторе вызывает ошибку, не может назначить вызываемый функтор std::function

В следующем полном тестовом примере, если я использую первый ctor, беря функтор по значению и перемещая его на место, код компилируется и работает, как и ожидалось. Однако, если я использую универсальный эталонный ctor, он не скомпилируется (я включ…
18 дек '13 в 23:04
1 ответ

Универсальная ссылка для ошибки типа шаблона

Извините за плохое название... Итак, обычно в такой функции: template <class T> void f(T&& i){ } T&& это универсальная ссылка. В таком контексте это rvalue-ссылка: template <class T> struct s{ void f(T&& t){} }; Э…
02 ноя '16 в 18:54
2 ответа

C++ Невозможно переместить unique_ptr с универсальными ссылками

Рассмотрим этот код: template<typename T> T mov(T&& t){ return std::move(t); } int main(){ std::unique_ptr<int> a = std::unique_ptr<int>(new int()); std::unique_ptr<int> b = mov(a); } mov Функция должна просто взять у…
2 ответа

Перемещение элементов из std::vector<T1> в std::vector<std:: pair <T1, T2 >>

Каков наиболее правильный и эффективный способ std:: переместить элементы из вектора определенного типа (T1) в вектор из std:: pair того же типа (T1) и другого типа (T2)? Другими словами, как мне написать MoveItems()? #include &lt;iostream&gt; // Fo…
26 окт '16 в 03:25
0 ответов

const применяется к параметру "универсальная ссылка"

Я наткнулся на статью Скотта Майерса об универсальных ссылках, ссылку. Из того, что я понял универсальная ссылка, это какой-то тип T&amp;&amp; может означать тип rvalue или lvalue в разных контекстах. Например: template&lt;typename T&gt; void f(T&am…
01 янв '16 в 14:06
2 ответа

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

Как специализировать шаблон функции, который принимает универсальный ссылочный параметр? foo.hpp: template&lt;typename T&gt; void foo(T &amp;&amp; t) // universal reference parameter foo.cpp template&lt;&gt; void foo&lt;Class&gt;(Class &amp;&amp; cl…
0 ответов

Являются ли параметры шаблона функции T& и T&& неоднозначными?

Рассмотрим эти две перегрузки: template &lt;typename T&gt; void foo(T &amp;) {} template &lt;typename T&gt; void foo(T &amp;&amp;) {} Они потенциально неоднозначны? Следующий код компилируется с Clang 3.4, но не работает с GCC 4.8, который сообщает …
1 ответ

C++ универсальная ссылка в конструкторе и оптимизации возвращаемого значения (rvo)

Почему оптимизация rvalue не происходит в классах с конструктором с универсальными ссылочными аргументами? http://coliru.stacked-crooked.com/a/672f10c129fe29a0 #include &lt;iostream&gt; template&lt;class ...ArgsIn&gt; struct C { template&lt;class ..…
1 ответ

Почему значения const l связываются иначе, чем значения const r, заданные T&& и const T& overloads?

Для этого кода (доступно на http://ideone.com/Mo7fQr) template&lt;typename T&gt; void f(const T&amp;) { std::cout &lt;&lt; "const T&amp; overload\n"; } template&lt;typename T&gt; void f(T&amp;&amp;) { std::cout &lt;&lt; "T&amp;&amp; overload\n"; } i…
20 июл '13 в 05:43
2 ответа

Разрешение перегрузки с универсальными ссылками

У меня есть функция, которая может принимать любой тип по универсальной ссылке, и я хотел бы перегрузить его для определенных типов (некоторые из них сами по себе шаблонизированы, хотя я не думаю, что это важно здесь). К сожалению, я не могу понять,…
0 ответов

Почему подписи make_shared и allocate_shared различаются для аргументов, которые нужно переслать?

Для того, чтобы создать std::shared_ptr для данного типа T Есть два пути среди других: std::allocate_shared а также std::make_shared, Основное отличие (или, по крайней мере, то, что меня интересует в этом вопросе) состоит в том, что первый делает вс…
4 ответа

Когда не использовать `auto&&`?

auto&amp;&amp; mytup = std::make_tuple(9,1,"hello"); std::get&lt;0&gt;(mytup) = 42; cout &lt;&lt; std::get&lt;0&gt;(mytup) &lt;&lt; endl; Есть ли необходимость в копировании / перемещении (без RVO) при возврате из make_tuple? Это вызывает неопредел…
13 фев '13 в 08:14
1 ответ

C++ Разрешение перегрузки с универсальным эталонным шаблоном функции, которое нельзя изменить

Предположим, где-то в моем коде есть функция foo с универсальным ссылочным параметром, который я не могу изменить: template&lt;typename T&gt; auto foo(T&amp;&amp; t) { std::cout&lt;&lt;"general version"&lt;&lt;std::endl; } Теперь хочу перегрузить fo…
0 ответов

Использование значения Rvalue в примере реализации is_copy_asignable

Я смотрю выступление Уолтера Брауна на CppCon 2014 "Современное шаблонное метапрограммирование: сборник". Во второй части он демонстрирует использование decltype и declval с примером реализации is_copy_assignable. Вот ссылка на видео со слайдом, на …
1 ответ

Выбор конструктора шаблона Variadic завершается неудачно, когда аргумент является ссылкой

У меня есть следующий код: #include &lt;iostream&gt; #include &lt;typeinfo&gt; template &lt;typename T&gt; struct A : T { template &lt;typename ...Args&gt; A(Args&amp;&amp;... params) : T(std::forward&lt;Args&gt;(params)...), x(0) { std::cout &lt;&l…
6 ответов

Получите преимущества универсальной ссылки, без универсальной ссылки

проблема Давайте предположим, что функция func который принимает любой контейнер в форме Container&lt;Type, N, Args...&gt; (это контейнер, который принимает в качестве первого аргумента шаблона тип, а в качестве второго std::size_t определяет, сколь…
26 июл '14 в 16:32
2 ответа

C++ явный универсальный ссылочный конструктор не скрывает конструктор копирования?

Наверное, мое понимание explicit недостаточно, но я удивляюсь, почему в следующем коде конструктор копирования не скрывается неверсальным ссылочным конструктором, когда я объявляю последний как explicit, struct A { A() = default; template&lt;typenam…
1 ответ

Универсальная ссылка в указателе на функцию-член

У меня возникли проблемы с пониманием, почему следующий код не может скомпилировать #include &lt;iostream&gt; #include &lt;typeinfo&gt; #define PRINT_FUNC() {std::cout &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; std::endl;} struct Obj { Obj(){PRINT_FUNC()…