我有以下代码:
#include <iostream>
#include <string>
using std::cout;
using std::endl;
void bar(const std::string& str)
{
cout << "const str - " << str << endl;
}
void bar(std::string&& str)
{
cout << "str - " << str << endl;
}
void foo(std::string&& str)
{
bar(str);
}
int main()
{
foo("Hello World");
}
在上面的代码中调用了void bar(const std::string& str)
重载。如果我想要调用void bar(std::string&& str)
重载,我必须写bar(std::move(str));
或bar(std::forward<std::string>(str));
显然,正向代码更长,但对我来说更有意义。我的问题是什么是更常用和更喜欢的。写bar(std::forward(str));
将是最好的解决方案imo,但这不是一个选项:)
答案 0 :(得分:8)
引用 Effective Modern C ++
从纯粹的技术角度来看,答案是肯定的:std :: forward可以做到这一切。 std :: move不是必需的。当然,这两种功能都不是必需的,因为我们可以在任何地方写出演员,但我希望我们同意那将是,令人讨厌的。 std :: move的吸引力很方便,错误的可能性更小,更清晰。
在这里使用std::move
void foo(std::string&& str)
{
bar(str);
}
将返回str
作为右值引用(这正是您想要实现的),而使用std::forward
将返回左值引用(您不感兴趣)或者右值参考(因此在这种情况下等同于std::move
)。显然使用none只会继续调用const std::string& str
,因为str
是该函数中的左值。
底线:他们会做同样的事情,但是因为
,首选使用std::move
std::forward
不打算以这种方式使用(cfr。Universal references)或在那种情况下使用它虽然肯定会有用我可能同意“我将这个rvalue引用转发给其他函数”可能作为一个独立的句子有意义,但它有点遗漏了问题。你可以重新连接你的大脑,让它像“保持'移动'这个右值引用到另一个函数”
答案 1 :(得分:5)
只要您确定它是左值参考,就可以移动它。
当您无法确定是否为右值或左值引用时,应在模板化代码中使用转发。 :)
模板代码&amp;&amp;平均通用引用,可以是右值或左值。
另请注意,std :: move在没有任何检查的情况下进行投射,与前进不同,因此如果您不确定要做什么,前进更安全,那么移动速度更快。