下面的程序不會在VS11 beta製造,GCC 4.5,或3.1鏗鏘的std ::螺紋,可移動的,不可複製的參數
#include <thread>
#include <memory>
int main() {
std::unique_ptr<int> p;
std::thread th([](std::unique_ptr<int>) {
},std::move(p));
th.join();
}
這是因爲參數類型是不可拷貝,但實現嘗試複製它。
據我所知,這個程序是完好的,應該工作。對std :: thread的要求似乎意味着可移動的,不可複製的參數應該在這裏工作。具體而言,它表示可調用對象和每個參數應滿足MoveConstructible要求,且INVOKE(DECAY_COPY(std::forward<F>(f)),DECAY_COPY(std::forward<Args>(args))...)
應爲有效表達式。
在這種情況下,我想表達出來的作品喜歡的東西:
template <class T> typename std::decay<T>::type decay_copy(T&& v)
{ return std::forward<T>(v); }
std::unique_ptr<int> p;
auto f = [](std::unique_ptr<int>) {};
decay_copy(f)(decay_copy(std::move(p)));
而且我不認爲這應該涉及p
副本。 gcc至少可以編譯這個表達式,儘管VS11沒有。
- 我是否錯誤的要求和參數必須是可複製的?
- 對於實現複製參數,標準是否在這個問題上留有餘地?
- 或者我嘗試不符合?
您似乎通過複製傳遞線程參數(按照匿名函數簽名)。參數類型不應該是'std :: unique_ptr &&'或'const std :: unique_ptr &'? –
2012-04-03 21:36:39
@安德烈:沒有任何東西可以通過複製傳遞;通過_value_傳遞參數將根據調用者是傳遞左值還是右值來複制或移動。 – ildjarn 2012-04-03 21:47:22
@ildjarn:對不起,我的意思是「按價值」,而不是「通過複製」。它忽略了按值傳遞參數將選擇移動構造函數(如果有)。 – 2012-04-03 22:23:49