gpt4 book ai didi

c++ - std::thread 构造函数第三个模板参数的目的是什么?

转载 作者:IT老高 更新时间:2023-10-28 21:43:05 34 4
gpt4 key购买 nike

std::thread 构造函数是这样声明的(使用 Visual Studio 2015):

template<class _Fn,
class... _Args,
class = typename enable_if<
!is_same<typename decay<_Fn>::type, thread>::value>::type>
explicit thread(_Fn&& _Fx, _Args&&... _Ax)

没有关于 _Fn_Args 的问题,但是,第三个 class = ... 完全让我感到困惑。它有什么作用,它是如何工作的以及它的用途是什么?

最佳答案

这是一个使用 SFINAE 有条件地启用过载的示例.

如果第一个参数的类型为 std::thread,则不应考虑将此重载用于重载解析.

请注意,C++ 标准头文件的原始源代码不适合阅读。它也不打算被模仿。 C++ 编译器实现者可以在他们的标准头文件实现中做很多你不能也不应该在这些头文件之外做的事情。其中最少的是以 _ 开头的变量。后跟一个大写字母(在用户代码中被禁止)。

检查默认参数的类型,如果 _Fnstd::thread ,对相同的引用,或对 cv 修改相同的引用。

typename enable_if<
!is_same<typename decay<_Fn>::type, thread>::value>::type>

decay<_Fn>::type剥离引用和简历资格。它还将对函数的引用转换为对函数的指针,对数组的引用转换为对第一个元素的指针,但这在这里并不重要。

假设 _Fnthread& .我会评估:

typename enable_if<
!is_same<typename decay<thread&>::type, thread>::value>::type>
typename enable_if<
!is_same<thread, thread>::value>::type>
typename enable_if<
!true>::type>
typename enable_if<
false>::type>
/* substitution failure occurs */>

enable_if<B>::type仅在 B 时存在是 true ;当_Fn是一个线程,它是假的,因此在重载解析期间存在替换失败。

SFINAE 意味着替换失败不是错误,而不是编译器提示,它只是从考虑中删除了这个重载。和 thread(thread const&) (我相信是 =delete ed)而是找到了构造函数。

关于c++ - std::thread 构造函数第三个模板参数的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46874955/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com