std::bind
和std::thread
分享一些設計原則。由於兩者的存儲與傳遞的參數本地OBJETS,我們需要爲使用std::ref
或std::cref
如果引用語義需要:By-ref參數:這是std :: thread和std :: bind之間的不一致嗎?
void f(int& i, double d) { /*...*/ }
void g() {
int x = 10;
std::bind(f, std::ref(x), _1) (3.14);
std::thread t1(f, std::ref(x), 3.14);
//...
}
但我通過最近的發現個人很好奇:std::bind
將允許你在上述情況下傳遞一個值,即使這不是人們通常想要的值。
std::bind(f, x, _1) (3.14); // Usually wrong, but valid.
但是,對於std::thread
這不是真的。以下將觸發編譯錯誤。
std::thread t2(f, x, 3.14); // Usually wrong and invalid: Error!
乍一看我以爲這是一個編譯器錯誤,但錯誤確實是合法的。看起來模板版本std::thread
的構造函數由於30.3.1.2強加的copy decaying要求(轉換int&
在int
)無法正確推導出參數。
問題是:爲什麼不需要類似std::bind
的論點?或者這是顯而易見的意圖不一致?
注意:解釋爲什麼它不是重複在下面的評論。
這不是重複的。 *這個問題正在解釋*我*問題的前提。此外,它不會觸及std :: thread。實際上,我所指的是其中一個註釋的一個反例(關於std :: thread的構造函數 –