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的构造函数 –