将在C+中移动语义+;11如果没有带函数签名的右值参数,是否执行? p>为了使程序运行更高效,从C++ 11引入语义,例如: void fun(const string& str); //1st void fun(string&& str); //2nd since c++ 11
如果我像将在C+中移动语义+;11如果没有带函数签名的右值参数,是否执行? p>为了使程序运行更高效,从C++ 11引入语义,例如: void fun(const string& str); //1st void fun(string&& str); //2nd since c++ 11,c++,c++11,move,move-semantics,C++,C++11,Move,Move Semantics,如果我像fun(“tmpStr”)一样使用它,将使用第二个用右值签名的函数,它比第一个函数更有效 但问题是,如果我只需要1个函数签名来处理同时具有左值和右值的参数,我该怎么办 如果保留第一个值,则该值对右值无效 如果保留第二个,则使用右值是有效的,但我必须fun(std::move(lvalue))使使用lvalue成为可能,我认为添加的代码std::move看起来是多余的---而且,这使得在这个函数之后未定义lvalue的状态 用上面的思想,如果没有像第一个函数签名那样的RValk参数,即使在
fun(“tmpStr”)一样使用它代码>,将使用第二个用右值签名的函数,它比第一个函数更有效
但问题是,如果我只需要1个函数签名来处理同时具有左值和右值的参数,我该怎么办
如果保留第一个值,则该值对右值无效李>
如果保留第二个,则使用右值是有效的,但我必须fun(std::move(lvalue))
使使用lvalue成为可能,我认为添加的代码std::move
看起来是多余的---而且,这使得在这个函数之后未定义lvalue的状态李>
用上面的思想,如果没有像第一个函数签名那样的RValk参数,即使在发布(优化)模式中,也会执行C++ 11中的移动语义吗?
如果答案不是,那么背后的原因是什么?在这种情况下,移动语义是不相关的,因为您不想修改参数
“tmpStr”
不是std::string
,而是常量字符*
。由于您使用的是对std::string
的非-(常量左值)引用,因此编译器必须在某处创建std::string
。分配开销已经发生。那么,如果不修改临时字符串,那么使用哪个引用实际上并不重要。编写函数的最佳方法是:
void fun(std::string_view sv)
这会自动处理字符串文本和std::string
s等,并且不会产生任何分配开销。这比移动更有效。不涉及移动语义。仅使用右值引用并不能使函数立即“更高效”。这是一种错误的想法。如果这些函数做同样的事情,您可以使用const lvalue ref.std::move
不是多余的,因为它使重载解析工作,并且lvalue保持在有效状态像“tmpStr”这样的字符串文字是一个const char*
。您使用“2ed”而不是“2nd”有什么特殊原因吗?因为这个词是“第二个”。@L.F.,很抱歉,我已经修复了它。谢谢你的回答,我以后会使用std::string_view。@DongRobbin如果你觉得这个答案有用,你可以通过单击投票按钮下方左侧的勾号来接受它,这样问题就被标记为已解决。