参考函数返回值

时间:2017-10-26 09:56:38

标签: c++ reference rvalue-reference

举个例子:

#include <string> 

std::string Foo() {
  return "something";
}

std::string Bar() {
  std::string str = "something";
  return str;
}

我不想复制返回值,这两个选项之间哪个更好?为什么?

 int main() {
   const std::string& a = Foo();
   std::string&& b = Foo(); 
   // ... 
 }

如果我现在使用Bar函数(而不是Foo),上面写的main()之间有什么区别吗?

 int main() {
   const std::string& a = Bar();
   std::string&& b = Bar(); 
   // ... 
 }

1 个答案:

答案 0 :(得分:6)

  

这两个选项之间有什么好处?

都不是。这是一个过早优化的练习。你正在尝试为它做编译工作。现在,返回值优化和复制省略实际上是法律。移动语义(适用于类似std::string的类型)已经提供了真正有效的回退。

所以让编译器做它的事情,并且更喜欢值语义:

auto c = Foo();
auto d = Bar();

至于Bar vs Foo。使用您喜欢的任何一种。 Bar特别是RVO友好。所以两者很可能最终都是一样的。