move()の挙動が分からなくなったため質問させてください。
ネットで調べるにもどう調べればよいのか分からなかったためここで質問させてください。
問題となったのは以下のスレッドのサンプルコードを実行した際です。
(少々長いコードですが move を利用しているところだけ見てください)
c++
1#include <chrono> 2#include <future> 3#include <iostream> 4#include <thread> 5#include <vector> 6 7using namespace std; 8 9class ThreadWrapper { 10 thread threadHandler; 11 12 public: 13 ThreadWrapper(const ThreadWrapper&) = delete; 14 ThreadWrapper& operator=(const ThreadWrapper&) = delete; 15 ThreadWrapper(std::function<void()> func); 16 ThreadWrapper(ThreadWrapper&& obj); 17 ThreadWrapper& operator=(ThreadWrapper&& obj); 18 ~ThreadWrapper(); 19}; 20 21ThreadWrapper::ThreadWrapper(std::function<void()> func) : threadHandler(func) {} 22ThreadWrapper::ThreadWrapper(ThreadWrapper&& obj) : threadHandler(move(obj.threadHandler)) { 23 cout << "move constructor is called" << endl; 24} 25ThreadWrapper& ThreadWrapper::operator=(ThreadWrapper&& obj) { 26 cout << "move assignment is called" << endl; 27 if (threadHandler.joinable()) { 28 threadHandler.join(); 29 } 30 threadHandler = move(obj.threadHandler); 31 return *this; 32} 33ThreadWrapper::~ThreadWrapper() { 34 if (threadHandler.joinable()) { 35 threadHandler.join(); 36 } 37} 38 39int main() { 40 std::function<void()> func = []() { 41 std::this_thread::sleep_for(std::chrono::seconds(1)); 42 std::cout << "From Thread ID : " << std::this_thread::get_id() << "\n"; 43 }; 44 std::vector<ThreadWrapper> vecOfThreads; 45 ThreadWrapper thwp1(func); 46 ThreadWrapper thwp2(func); 47 vecOfThreads.push_back(std::move(thwp1)); 48 vecOfThreads.push_back(std::move(thwp2)); <----- この行 49 return 0; 50}
結果は下記のようになり、「move constructor is called」が3回出力されています。
move constructor is called move constructor is called move constructor is called destructor is called destructor is called destructor is called destructor is called From Thread ID : From Thread ID : 140529029420800 140529037813504 destructor is called
サンプルコードの「この行」という行を削除して実行したところ
下記のように「move constructor is called」が1回だけ出力されました。
move constructor is called destructor is called From Thread ID : 139751244379904 destructor is called destructor is called From Thread ID : 139751252772608
なぜ一つのmoveを削除しただけで2つのmoveのログが消えてしまったのでしょうか。
そもそも、moveを呼び出しているのはこの2回だけなのに 「move constructor is called」が3回表示されるのが不可解です。
vecOfThreads.push_back(std::move(thwp1)); vecOfThreads.push_back(std::move(thwp2)); <----- この行
以上、よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/20 22:25