如果没有带有函数签名的右值参数,是否会执行 C++ 11 中的 Move Semantic?

Would Move Semantic in C++ 11 be executed if there is no rvalue parameter with function signature?

为了让程序运行更高效,从C++ 11开始引入了移动语义,例如:

void fun(const string& str); //1st
void fun(string&& str); //2nd since c++ 11

如果我像fun("tmpStr");那样使用它,将使用右值签名的第二个函数,它比第一个函数更有效。

但问题是,如果我只需要 1 个函数签名来处理同时具有左值和右值的参数,我该怎么办?

  1. 如果保留第一个,右值效率不高;
  2. 如果保留第二个,它对右值很有效,但我必须 fun(std::move(lvalue)) 才能使左值成为可能,我认为添加的代码 std::move 看起来像是多余的—— -此外,这使得左值的状态在此函数之后未定义。

基于以上想法,我想知道如果没有像第一个那样具有函数签名的右值参数,即使只是在发布(优化)模式下,是否会执行 C++ 11 中的移动语义? 如果答案不是,那背后的原因是什么?

在这种情况下移动语义无关紧要,因为您不想修改参数。

"tmpStr" 不是 std::string,而是 const char*。由于您正在对 std::string 进行非(const 左值)引用,因此编译器必须在某处创建一个 std::string。分配开销已经产生。然后,如果您不修改临时字符串,您使用哪个引用并不重要。函数的最佳写法是:

void fun(std::string_view sv)

这会自动处理字符串文字和 std::strings 等,并且会产生零分配开销。这比移动更有效率。不涉及移动语义。