C++ 右值参数

phi*_*inn 12 c++ rvalue

我写这个代码:

#include <iostream>
using namespace std;
class Foo
{

public:
    int a = 0;
    Foo()
    {
        cout << "ctor: " << this << endl;

    }
    ~Foo() {
       cout << "dtor: " << this << endl;
    }
};

Foo f()
{
    Foo foo;
    cout << "f " << &foo << endl;
    return foo;
}
void ff(Foo &&ffoo)
{
    cout << "ff " << &ffoo << endl;

}

int main()
{
    ff(f());
    std::cout << "Hello World!\n";
}
Run Code Online (Sandbox Code Playgroud)

输出看起来不错:

ctor: 0x7ffeda89bd7c
f 0x7ffeda89bd7c
ff 0x7ffeda89bd7c
dtor: 0x7ffeda89bd7c
Run Code Online (Sandbox Code Playgroud)

但是当我删除~Foo()这样的:

ctor: 0x7ffeda89bd7c
f 0x7ffeda89bd7c
ff 0x7ffeda89bd7c
dtor: 0x7ffeda89bd7c
Run Code Online (Sandbox Code Playgroud)

我得到了这个输出:

ctor: 0x7fffd5c8bf4c
f 0x7fffd5c8bf4c
ff 0x7fffd5c8bf6c
Hello World!
Run Code Online (Sandbox Code Playgroud)

为什么与 的地址ffoo不同f?不应该是一样的吗?

编译cmd是:

g++ tmp.cpp 
g++ --version
g++ (Debian 8.3.0-6) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
Run Code Online (Sandbox Code Playgroud)

Jar*_*d42 2

仅当 NRVO 适用时,您才会拥有相同的地址。

NRVO并不能得到保证。

碰巧,随着您的更改,NRVO 在一种情况下发生,而在另一种情况下则不会,但在两个版本中,NRVO 都可能发生。