確認した環境
- Windows10
- Visual Studio Community 2019 Version 16.2.5
本題
C++ のムーブコンストラクタはデフォルトが用意されていますが、 int などの基本型がどのようになるのかを実際に動かして確認しました。 ムーブコンストラクタがちゃんと呼ばれていることを確かめるために、 string や unique_ptr もメンバーに含めてこれらが空になるかも確認します。 以下のソースコードで確認したところ、ムーブ元(下記ソースコードのa)のint や生ポインタはムーブ前後で同じ値でした。
ソースコード
#include <iostream> #include <memory> #include <sstream> class MyClass { public: MyClass(int n) { int_ = n; ptr_ = &int_; unique_ptr_ = std::make_unique<int>(n); std::stringstream ss; ss << n; string_ = ss.str(); } MyClass(MyClass&&) = default; void print() { std::cout << "int : " << int_ << std::endl; std::cout << "&int : " << &int_ << std::endl; std::cout << "ptr : " << ptr_ << std::endl; std::cout << "unique_ptr_.get() : " << unique_ptr_.get() << std::endl; std::cout << "string : " << string_ << std::endl; std::cout << std::endl; } private: int int_; int *ptr_; std::unique_ptr<int> unique_ptr_; std::string string_; }; int main() { MyClass a(10); std::cout << "------------ A ------------" << std::endl; a.print(); MyClass b(std::move(a)); std::cout << "------------ A ------------" << std::endl; a.print(); std::cout << "------------ B ------------" << std::endl; b.print(); return 0; }
結果(Visual Studio 2019)
------------ A ------------ int : 10 &int : 0000005D7FAFF838 ptr : 0000005D7FAFF838 unique_ptr_.get() : 0000021012701B10 string : 10 ------------ A ------------ int : 10 &int : 0000005D7FAFF838 ptr : 0000005D7FAFF838 unique_ptr_.get() : 0000000000000000 string : ------------ B ------------ int : 10 &int : 0000005D7FAFF870 ptr : 0000005D7FAFF838 unique_ptr_.get() : 0000021012701B10 string : 10