【发布时间】:2020-12-13 00:48:04
【问题描述】:
我希望在 C++20 中,以下代码在 A 和 B 的打印之间不打印任何内容(因为我希望保证 RVO 能够启动)。但输出是:
一个
再见
B
C
再见
再见
所以大概正在创建一个临时的。
#include <iostream>
#include <tuple>
struct INeedElision{
int i;
~INeedElision(){
std::cout << "Bye\n";
}
};
std::tuple<int, INeedElision> f(){
int i = 47;
return {i, {47}};
}
INeedElision g(){
return {};
}
int main()
{
std::cout << "A\n";
auto x = f();
std::cout << "B\n";
auto y = g();
std::cout << "C\n";
}
这种行为的原因是什么? 是否有避免复制的解决方法(不使用指针)?
【问题讨论】:
标签: c++ c++20 stdtuple copy-elision rvo