【发布时间】:2023-03-08 16:31:01
【问题描述】:
如果我们写如下函数:
auto foo() {
Foo foo { /* ... */ };
do_stuff(foo);
return foo;
}
然后NRVO 应该启动,这样foo 在返回时不会被复制。
现在假设我想返回两个不同的值:
auto foo() {
Foo foo { /* ... */ };
Bar bar { /* ... */ };
do_stuff(foo, bar);
return std::make_tuple(foo, bar);
}
这种幼稚的实现可能会触发 Foo 和 Bar (GodBolt) 的两个副本的构造。
我应该如何最好地修改我的代码以避免这种复制,而不会弄乱我的返回类型?
【问题讨论】:
标签: c++ move-semantics copy-elision nrvo stdmove