【发布时间】:2016-05-15 19:08:45
【问题描述】:
显然可以将右值引用传递给std::thread 构造函数。我的问题是在cppreference 中定义了这个构造函数。它说这个构造函数:
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
创建新的 std::thread 对象并将其与 执行。首先,构造函数复制/移动所有参数( 函数对象 f 和所有 args...) 到线程可访问的存储,就好像 按功能:
template <class T>
typename decay<T>::type decay_copy(T&& v) {
return std::forward<T>(v);
}
据我所知:
std::is_same<int, std::decay<int&&>::type>::value
返回真。这意味着std::decay<T>::type 将删除参数的右值引用部分。那么std::thread 构造函数如何知道哪个参数是由左值或右值引用传递的呢?因为所有T&和T&&都会被std::decay<T>::type转换成T
【问题讨论】:
-
"对类型 T 应用左值到右值、数组到指针和函数到指针的隐式转换,删除 cv 限定符,并将结果类型定义为成员 typedef 类型" en.cppreference.com/w/cpp/types/decay - 你在哪里看到它删除了引用?
-
@xaxxon 你错过了
::type。 -
@T.C.删除了——但为什么它们是一样的?
-
@xaxxon 那是“左值到右值”部分。
-
我明白了。不是右值会变成左值,而是 int 会变成 int&&
标签: c++ multithreading c++11 constructor perfect-forwarding