如果我们编写如下函数:
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)的两个副本的构造。
我应该如何最好地修改我的代码以避免这种复制,而不会弄乱我的返回类型?