I would expect that in C++20 the following code prints nothing between prints of A and B (since I expect guaranteed RVO to kick in). But output is:
A
Bye
B
C
Bye
Bye
So presumably one temporary is being created.
#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";
}
What is the reason for this behavior? Is there a workaround to avoid copy (without using pointers)?
 
     
    