Tag: 完美转发

完美的转发 – 这是关于什么的?

可能重复: 使用forward的优点 有人可以向我解释什么是完美的转发?

应该将C ++ 11中的所有/大多数setter函数写成接受通用引用的函数模板吗?

考虑一个具有N成员variables的类X ,每个variables都是可 复制的和可移动的 ,以及N相应的设置函数。 在C ++ 98中, X的定义可能如下所示: class X { public: void set_a(A const& a) { _a = a; } void set_b(B const& b) { _b = b; } … private: A _a; B _b; … }; 上面的类X Setter函数可以绑定到左值和右值参数。 根据实际的参数,这可能会导致创build一个临时的,最终会导致一个副本分配; 由于这个原因,这种devise不支持不可复制的types。 使用C ++ 11,我们可以移动语义,完美转发和通用引用(Scott Meyers的术语),通过以这种方式重写它们,可以更有效地使用setter函数: class X { public: template<typename T> void set_a(T&& a) […]

我可以通常/总是使用std :: forward而不是std :: move吗?

我一直在观看斯科特·迈耶斯(Scott Meyers) 关于 C ++和Beyond 2012会议上Universal Reference的演讲,到目前为止一切都很有意义。 然而,观众在大约50分钟的时间里问了一个问题,我也在想。 迈尔斯说,他不关心答案,因为它是非惯用的,会愚蠢的他的头脑,但我仍然感兴趣。 代码如下: // Typical function bodies with overloading: void doWork(const Widget& param) // copy { // ops and exprs using param } void doWork(Widget&& param) // move { // ops and exprs using std::move(param) } // Typical function implementations with universal reference: template <typename T> void doWork(T&& […]

std :: move和std :: forward有什么区别?

我看到这里: 移动构造函数调用基类移动构造 有人可以解释: std::move和std::forward之间的区别,最好用一些代码示例? 如何轻松考虑,何时使用哪个

T &&(双和号)在C ++ 11中意味着什么?

我一直在研究C ++ 11的一些新特性,我注意到了在声明variables中的双和号,比如T&& var 。 一开始,这个野兽叫什么名字? 我希望Google允许我们search这样的标点符号。 究竟是什么意思? 乍一看,它似乎是一个双引用(就像C风格的双指针T** var ),但是我很难想到这个用例。

使用forward的优点

在完美转发中,使用std::forward将指定的右值引用t1和t2转换为未命名的右值引用。 这样做的目的是什么? 如果我们将t1和t2作为左值,那么这将如何影响被调用的函数inner ? template <typename T1, typename T2> void outer(T1&& t1, T2&& t2) { inner(std::forward<T1>(t1), std::forward<T2>(t2)); }

make_unique和完美的转发

为什么标准C ++ 11库中没有std::make_unique函数模板? 我发现 std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3)); 有点冗长。 以下不会更好吗? auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3); 这隐藏了new很好,只提到一次类型。 无论如何,这是我尝试执行make_unique : template<typename T, typename… Args> std::unique_ptr<T> make_unique(Args&&… args) { return std::unique_ptr<T>(new T(std::forward<Args>(args)…)); } 我花了相当长的时间才得到std::forward东西来编译,但我不确定是否正确。 是吗? std::forward<Args>(args)…是什么意思? 编译器做了什么?