[英]std::thread arguments (value vs. const)
当我使用函数生成新线程( std::thread
)时,该函数的参数是按值而不是按引用的。
因此,如果我使用参考参数( int& nArg
)定义该函数,则我的编译器(mingw 4.9.2)将输出错误(在compilian-suaeli中,类似“缺少复制构造函数”之类的;-)
但是,如果我将该引用参数const int& nArg
const( const int& nArg
),则不会抱怨。
有人可以解释一下吗?
如果要传递引用,则必须std::reference_wrapper
std::ref
将其包装到std::reference_wrapper
。 喜欢:
#include <functional>
#include <thread>
void my_function(int&);
int main()
{
int my_var = 0;
std::thread t(&my_function, std::ref(my_var));
// ...
t.join();
}
std::thread
的参数仅使用一次。
实际上,它将它们存储在std::tuple<Ts...> tup
。 然后执行f( std::get<Is>(std::move(tup))...)
。
传递std::get
右值tuple
意味着可以从元组中的值或右值引用字段中获取状态。 如果没有元组是右值,它会给它一个引用。
除非您使用reference_wrapper
(即std::ref
/ std::cref
),否则您传递给std::thread
的值将作为值存储在std::tuple
。 这意味着您调用的函数被传递一个rvalue到std::tuple
的值。
右值可以绑定到const&
而不能绑定到&
。
现在,上面的std::tuple
是一个实现细节,是std::thread
一个设想实现。 标准中的措词较为晦涩。
为什么标准说发生这种情况? 通常,不应将&
参数绑定到将立即丢弃的值。 该函数认为它正在修改调用者可以看到的内容。 如果该值将被立即丢弃,则通常是调用者出错。
另一方面, const&
参数会绑定到将立即丢弃的值,因为我们将它们用于效率目的而不仅仅是参考目的。
或者,大概是因为
const int& x = 7;
是合法的
int& x = 7;
不是。 第一个是对逻辑上被丢弃的对象的const&
(不是由于引用生存期的延长,而是逻辑上是临时的)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.