在C++中,您可以将函数的返回值(返回值而不是引用)绑定到const引用上,代码仍然有效,因为这个临时对象的生命周期将延长到作用域的末尾。例如:
std::string get_string() {
return "abc";
}
void f() {
const std::string& str = get_string();
std::cout << str; // valid, str is not dangling reference.
}
我的问题是,什么时候它有用,例如代码什么时候像这样。A get_a();
const A& a = get_a();
胜过代码
A get_a();
A a = get_a();
以什么方式(例如更快,更小的二进制大小等)? A
,get_a
和调用 get_a
后代码实现应该是什么?
我手动测试了几个案例,在每种情况下似乎都有相同数量的复制和移动。
让我们限制这个问题到当前的C++标准、使用优化(O2,O3或其他编译器的等效选项)的现代编译器和版本。
auto &&
可以绑定到任何东西,因此更具适应性,但那并不是同一件事情。但也许我误解了,或者我只是在挑刺。在这里学到了关于auto &&
的一些有趣的东西。链接 - Paul Sandersobj.get() = 5;
来给obj
赋值,那么auto x = obj.get(); x = 5;
是否会达到相同的效果?如果get
的返回值是代理,则是的。如果get
的返回值是语言引用,则不是。你可以使用auto&&
来表示你想要存储get
返回的内容。 - Nicol Bolasint& get() { ... } ... auto x = obj.get();
,你确实不能通过x
对obj
进行赋值。但是为什么呢?在这里找到了答案:当自动推断类型时,它不会推断出引用类型,而总是推断出值类型。这就是关键短语。哎呀,使用这种语言一定要非常小心啊。 - Paul Sanders