我预期在C++20中,以下代码在打印A和B之间不会输出任何内容(因为我预期有保证的RVO会发生)。但实际输出为:
A
Bye
B
C
Bye
Bye
因此可以推断出一个临时对象被创建了。
#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";
}
这个行为的原因是什么?
有没有避免复制(不使用指针)的解决方法?
https://godbolt.org/z/zasoGd
std::tuple
的唯一构造函数。实际上在这种情况下使用的是这个构造函数吗? - Markus Mayr