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

Идеальная пересылка описывает свойство шаблонов функций C++11, которое позволяет правильно выводить аргументы как lvalue или rvalue и пересылать их в той же форме другим функциям.
2 ответа

std::move или std::forward при назначении универсального конструктора переменной-члену в C++

Рассмотрим следующие классы foo1 а также foo2 template <typename T> struct foo1 { T t_; foo1(T&& t) : t_{ std::move(t) } { } }; template <typename T> struct foo2 { foo1<T> t_; foo2(T&& t) : t_{ std::forward<T>…
2 ответа

C++: в списке базовых объектов производная память дает неожиданные результаты при передаче по ссылке

У меня возникают некоторые проблемы с пониманием границ использования ссылок вместо указателей: как я могу передать производный объект без виртуальных функций, только набор данных, в список базовых объектов? В моем приложении есть объект события и о…
25 янв '14 в 23:55
1 ответ

Оптимизация переезда

Рассмотрим две реализации класса: struct S1 { std::vector< T > v; void push(T && x) { v.push_back(std::move(x)); } void push(T const & x) { push(T(x)); } void pop() { v.pop_back(); } void replace(T && x) { pop(); push(std::…
2 ответа

Каково намерение конструктора forward-by-lvalue-reference, пока существует совершенный конструктор пересылки?

Давайте принимать std::pair<T1, T2> В качестве примера. Он имеет следующие два конструктора: constexpr pair( const T1& x, const T2& y ); // #1 template< class U1, class U2 > constexpr pair( U1&& x, U2&& y ); // #2…
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…
2 ответа

Параметры пересылки в диспетчеризации тегов

Я пишу функцию для привязки параметров SQL и хочу использовать диспетчеризацию тегов. Итак, я написал этот код: class OraclePreparedStatement { public: template&lt;typename T&gt; void bind_param(uint32_t col_index, T&amp;&amp; param) { bind_param_im…
1 ответ

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

У меня есть следующий тестовый код. Смотрите godbolt https://godbolt.org/z/fLRM8d для исполняемого примера template &lt;typename T&gt; struct Traits { static const bool value = false; }; struct Zip{}; template &lt;&gt; struct Traits&lt;Zip&gt; { sta…
12 дек '18 в 11:28
1 ответ

Проблема с пересылкой копирующего конструктора

Кто-нибудь знает, почему не работает пересылочная копия ctor? Ошибка компилятора, когда один тип является вектором, а другой - стеком??? #include "stdafx.h" #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;type_traits&gt; using namespa…
30 ноя '12 в 06:17
2 ответа

Как std:: применять параметры forward без явного std::forward?

Рассмотреть возможность реализации std::apply: namespace detail { template &lt;class F, class Tuple, std::size_t... I&gt; constexpr decltype(auto) apply_impl(F &amp;&amp;f, Tuple &amp;&amp;t, std::index_sequence&lt;I...&gt;) { return std::invoke(std…
21 дек '16 в 10:34
1 ответ

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

SSCCE: #include &lt;functional&gt; using std::function; using std::forward; template&lt;typename ToType, typename... FromTypes&gt; ToType construct(FromTypes&amp;&amp;... fromTypes) { return ToType(forward&lt;FromTypes&gt;(fromTypes)...); } class Ma…
0 ответов

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

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

Идеальная пересылка с несколькими проходами по входным аргументам

Рассмотрим следующую функцию accept который принимает "универсальную ссылку" типа T и направляет это к parse&lt;T&gt;() Функциональный объект с перегрузкой для lvalues ​​и один для rvalues: template&lt;class T&gt; void accept(T&amp;&amp; arg) { pars…
1 ответ

Идеальная пересылка параметров шаблона переменной в функцию-член

Я пытаюсь реализовать шаблон наблюдателя с примером использования следующим образом: class Widget { class WidgetObserver { virtual void SomethingHappened(Widget&amp;) { }; virtual void TextChanged(Widget&amp;, const char*) { }; virtual void BoundsCh…
13 янв '18 в 15:39
1 ответ

Возможна ли регрессия std::forward с g++ 6.1 - ошибка или предполагаемое поведение?

g++ 6.1 была недавно введена в тестовые репозитории Arch Linux, и часть моего кода, успешно скомпилированного с g++ 5.3.0, больше не компилируется. Я сделал минимальный пример: gcc.godbolt.org ссылка // This code compiles with g++ 5.3.0 // This does…
04 май '16 в 09:10
3 ответа

C++ множественный доступ к rvalue-ссылке в том же операторе, что и совершенная пересылка

Следующий код безопасен? Особенно если vec является ссылкой на rvalue, делает ли последняя строка то, что должна (а именно рекурсию, в которой элементы vec правильно подведены)? template&lt;typename VectorType&gt; auto recurse(VectorType&amp;&amp; v…
13 ноя '14 в 03:22
1 ответ

Отличается между движением и вперед в этом примере

Первый пример, который принимает A по значению, делает два хода, а один по refref делает только один ход. В чем разница? struct A { A() { cout &lt;&lt; "constructor" &lt;&lt; endl;} A(const A&amp;) { cout &lt;&lt; "copy constructor " &lt;&lt; endl;}…
21 ноя '12 в 15:53
1 ответ

Прекрасно переадресация функции оболочки?

Рассмотрим следующий функтор, чтобы помочь определить, какая версия его operator() называется. struct functor { void operator()() {std::cout &lt;&lt; "functor::operator" &lt;&lt; std::endl;} void operator()() const {std::cout &lt;&lt; "functor::oper…
1 ответ

Идеальная функция обратного вызова

Цель: получить функцию обратного вызова, которая будет принимать параметры любого типа в качестве параметров функции обратного вызова. .h template &lt;typename F, typename A&gt; void DelayedCallback(F&amp;&amp; CallbackFunction, A&amp;&amp; Args = N…
5 ответов

Непонимание двойной пересылки lvalue - когда передается по значению

#include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;type_traits&gt; #include &lt;utility&gt; using namespace std; template &lt;typename Func, typename... Args&gt; void proxy(Func f, Args&amp;&amp;... args) { f(std::forward&lt;Args&gt;(arg…
22 июн '18 в 15:14
3 ответа

Переадресация методов C++

Мне нужно реализовать класс Container, который действует точно так же, как содержащийся класс шаблона: template &lt;typename T&gt; class Container { public: //... private: // T data_; }; T может быть предопределенным типом (например, int) или пользо…