は、次のコードスニペットを考えてみましょう:それはg++
とclang++
と出力と罰金コンパイルmoveコンストラクタを実装することは戻り値の最適化にどのように影響しますか?
#include <iostream>
#include <string>
class A {
public:
A() {
std::cout << "A::A()\n";
}
~A() {
std::cout << "A::~A()\n";
}
A(const A&) = delete;
A(A&&) {
std::cout << "A::A(A&&)\n";
};
};
A f() {
A a;
return a;
}
int main() {
A a = f();
return 0;
}
RVOが、その場合にはで蹴るように思え
A::A()
A::~A()
です。移動コンストラクタは呼び出されていないことに注意してください。しかしながら
、一方がコード上およびスニペットから未使用の移動コンストラクタは、このになることを削除する場合:
#include <iostream>
#include <string>
class A {
public:
A() {
std::cout << "A::A()\n";
}
~A() {
std::cout << "A::~A()\n";
}
A(const A&) = delete;
};
A f() {
A a;
return a;
}
int main() {
A a = f();
return 0;
}
clang++
とg++
両方が原因クラスA
のコピーコンストラクタでこれをコンパイルすることを拒否されます削除済みとマークされているため、RVOが実行されていないようです。
未使用の移動コンストラクタを削除すると、これにつながる可能性がありますか?
私のためにうまくコンパイルします。 'Apple LLVM version 7.3.0(clang-703.0.31)'を使っています。また、http://ideone.com/xTpD56 –
コピーコンストラクタを宣言した場合、移動コンストラクタは暗黙的に宣言されません。 –