因此,这在 GCC、CLANG 和 MSVC 上编译得很好,但输出不同:
#include <iostream>
using namespace std;
class A {
public:
A() {
cout << this << " def" << endl;
}
A(const A&) {
cout << this << " copy" << endl;
}
A(A&&) {
cout << this << " move" << endl;
}
A& operator= (const A&) {
cout << this << " copy=" << endl;
return *this;
}
A& operator= (A&&) {
cout << this << " move=" << endl;
return *this;
}
~A() {
cout << this << " ~A" << endl;
}
};
A f() {
A a;
return a;
}
int main(){
A a = f();
}
使用 GCC 和 CLANG 输出:
- 0xbfad67cf 定义
- 0xbfad67cf ~A
虽然 MSVC out 符合预期(C++11 标准):
- 0039FA3B 定义
- 0039FA3B 移动
- 0039FA3B ~A
因此,使用 MSVC 编译的代码调用移动构造函数,而使用 GCC 和 CLANG 编译的代码不会调用移动构造函数。我还尝试禁用优化,但仍然得到相同的输出。更奇怪的是,当我将 f() 更改为返回 A() 时,即使在 MSVC 上也不会调用移动构造函数。
编译器版本:
- gcc:版本 4.7.2 (GCC)
- clang:版本 3.2(标签/RELEASE_32/final)目标:i386-pc-linux-gnu
平台: Linux/ArchLinux