举个例子:
#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();
// ...
}
答案 0 :(得分:6)
这两个选项之间有什么好处?
都不是。这是一个过早优化的练习。你正在尝试为它做编译工作。现在,返回值优化和复制省略实际上是法律。移动语义(适用于类似std::string
的类型)已经提供了真正有效的回退。
所以让编译器做它的事情,并且更喜欢值语义:
auto c = Foo();
auto d = Bar();
至于Bar
vs Foo
。使用您喜欢的任何一种。 Bar
特别是RVO友好。所以两者很可能最终都是一样的。