Sử dụng MSVC2012,Tại sao std :: packaged_task <void()> không hợp lệ?
Đoạn mã dưới đây sẽ biên dịch và chạy như mong đợi
std::packaged_task< int() > task([]()->int{ std::cout << "hello world" << std::endl; return 0; });
std::thread t(std::move(task));
t.join();
trong khi đoạn mã sau sẽ thất bại trong việc biên dịch và chạy
std::packaged_task< void() > task([](){ std::cout << "hello world" << std::endl; });
std::thread t(std::move(task));
t.join();
Tại sao điều này như vậy?
Edit: Là một workaround, nó có thể sử dụng std :: hứa sẽ có được một std :: tương lai trên một hàm trả về void
std::promise<void> promise;
auto future = promise.get_future();
std::thread thread([](std::promise<void> &p){ std::cout << "hello world" << std::endl; p.set_value(); }, std::move(promise));
future.wait();
Lưu ý rằng có một lỗi trong thư viện vs2012 với std :: thread buộc bạn vượt qua lời hứa dưới dạng tham chiếu giá trị l và di chuyển lời hứa, nó sẽ không biên dịch nếu bạn chuyển lời hứa theo giá trị hoặc tham chiếu giá trị r. Điều này được cho là do việc thực hiện sử dụng std :: bind() không hoạt động như mong đợi.
Thú vị ... lỗi thứ hai đưa ra khi biên dịch là gì? – Yuushi
Đây có thể là lỗi trong MSVC++. –
Từ những gì tôi truy tìm vào việc thực hiện, nó cuối cùng đi xuống để lưu trữ trạng thái thực thi đối tượng hàm, cụ thể trong một lớp mẫu được gọi là '_State_manager'. Không có sự chuyên môn hóa của '_State_manager' cho trạng thái' void', giống như một lỗi. Tôi có thể hoàn toàn ra ngoài ăn trưa, nhưng đó là nơi nó xuất hiện mọi thứ sụp đổ. –
WhozCraig