std :: forward的使用比较

Ang*_*tis 1 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;
}
Run Code Online (Sandbox Code Playgroud)

与此相比:

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

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

Bri*_*ian 7

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

为避免混淆读者的代码(包括您自己),您应该std::move在此上下文中使用.std::forward<T>只有在T从转发引用中推导出来时才会使用它T&&,而在代码中并非如此,因为T它实际上是封闭的参数,而不是函数.至于std::forward<T&&>它的作用与std::forward<T>后者适用的情况相同,但这一点都不明显,所以它也会使读者感到困惑.

  • @PiotrSkotnicki如果`T`是左值引用类型,则整个类都是格式错误的,因为两个重载都会减少为采用相同的参数.所以整件事都没有实际意义. (2认同)
  • 更短的答案:这个狗屎很复杂. (2认同)