std :: forward的使用比较

时间:2016-03-10 19:32:41

标签: c++ c++11

考虑简单的代码(免责声明:这是一个noobie问题):

template<typename T> struct foo
{
foo(const T&);
foo(T&& ctorArguement):ptrToSomeType(new someType(std::forward<T&&>(ctorArguement))){}
                                                                ^^
std::unique_ptr<someType> ptrToSomeType;
}

与此相比:

template<typename T> struct foo
{
foo(const T&);
foo(T&& ctorArguement):ptrToSomeType(new someType(std::forward<T>(ctorArguement))){}
                                                               ^^
std::unique_ptr<someType> ptrToSomeType;
}

我想我应该使用std :: move但我特别想知道这两种情况。两个版本完全相同,还是一个比另一个更好?

1 个答案:

答案 0 :(得分:7)

这两个代码片段做同样的事情。第一个投射到T&& &&,即T&&。第二个投射到T&&。使用std::move会产生同样的效果。

为避免混淆读者的代码(包括您自己),您应该在此上下文中使用std::movestd::forward<T>仅在从转发引用T推导出T&&时使用,并且在您的代码中不是这种情况,因为T实际上是一个参数封闭的,而不是函数。对于std::forward<T&&>,当std::forward<T>适用时,它与chain.sort((o1, o2) -> { if (o1 != null && o2 != null) { return o1.getHead().compare(o2.getTail()) } return 0; }); 的功能相同,但这一点并不明显,因此也会让读者感到困惑。