为什么不能使用std :: tuple获得保证的复制省略?

问题描述

我希望在C ++ 20中,以下代码在A和B的打印之间不会打印任何内容(因为我希望可以保证RVO起作用)。但是输出是:

A

再见

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";
}

此行为的原因是什么? 有没有避免复制的解决方法(不使用指针)?

https://godbolt.org/z/zasoGd

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)