したがって、これは 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 (tags/RELEASE_32/final) ターゲット: i386-pc-linux-gnu
プラットフォーム: Linux/ArchLinux