我想测试一下右值引用传递,写了这样的代码
#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";
}
输出的地址都一样,看起来很正常
ctor: 0x7ffeda89bd7c
f 0x7ffeda89bd7c
ff 0x7ffeda89bd7c
dtor: 0x7ffeda89bd7c
但是当我注释掉 ~Foo()
函数的时候:
#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";
}
输出就变成了这样:
ctor: 0x7fffd5c8bf4c
f 0x7fffd5c8bf4c
ff 0x7fffd5c8bf6c
Hello World!
为什么 ffoo
的地址和 f
不一样了呢? 求解答。
compile cmd is:
g++ tmp.cpp
g++ --version
g++ (Debian 8.3.0-6) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
###你这个问题涉及到编译器层面了,首先确认一点,这个代码在 Windows 下运行,跟 Linux 下的结果并不一致,在 Windows 下运行,即使带析构函数,其结果也是不一样的,如下:
ctor: 00D8F350
f 00D8F350
dtor: 00D8F350
ff 00D8F51C
dtor: 00D8F51C
Hello World!
这说明你的这个问题其实是编译器的差异所导致,正常来说
Foo f()
{
Foo foo;
cout << "f " << &foo << endl;
return foo;
}
你在 f() 函数里面定义的 foo 变量是声明在局部堆栈里面,即便编译器帮你优化,也不应该直接返回局部堆栈里面的东西,因为函数返回后堆栈指针就调平了,类似 move 这样的优化只是让你少调用一次构造而已,但数据仍然要做拷贝的。
但 g++ 能让局部堆栈里面的东西在函数返回后也能继续使用,那就是g++编译器的优化技术牛X了,但这东西是不能当作标准来使用的。