将在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如果你觉得这个答案有用,你可以通过单击投票按钮下方左侧的勾号来接受它,这样问题就被标记为已解决。