考虑简单的代码(免责声明:这是一个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但我特别想知道这两种情况。两个版本完全相同,还是一个比另一个更好?
答案 0 :(得分:7)
这两个代码片段做同样的事情。第一个投射到T&& &&
,即T&&
。第二个投射到T&&
。使用std::move
会产生同样的效果。
为避免混淆读者的代码(包括您自己),您应该在此上下文中使用std::move
。 std::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;
});
的功能相同,但这一点并不明显,因此也会让读者感到困惑。