lifetime of function local variable and temporary object

Viewed 69

I'm getting the different behaviour on different compliler, on GCC temporary object and local variable are destroyed in the end of an expression but on MSVC compiler, local variable and temporary object are destroyed at the end of function. why i'm getting this different behaviour ? see live demo

struct X{ 
    X() 
    {
        std::cout << "X::X() " << '\n';
    }

    X(const X& arg)
    {
        std::cout << "X::Copy" << '\n';
    }

    X(X&& arg)
    {
        std::cout << "C::move" << '\n';
    }
        
    ~X(){ std::cout << "Goodbye, cruel world!\n"; }

};
X  f(X  x){
    X arg{};
    std::cout << "Inside f()\n";
    return x;
}
void g(X  x){
    std::cout << "Inside g()\n";
}

int main()
{
    X arg{};
    g(f(arg));
}

GCC output:

X::X() 
X::Copy
X::X() 
Inside f()
C::move                 // on which line it is caling move construtor ?
Goodbye, cruel world!   // which object does get destructed ?, on which line ?
Inside g()
Goodbye, cruel world!
Goodbye, cruel world!
Goodbye, cruel world!

MSCV output:

X::X() 
X::Copy
X::X() 
Inside f()
C::move
Goodbye, cruel world!
Goodbye, cruel world!
Inside g()
Goodbye, cruel world!
Goodbye, cruel world!
0 Answers
Related