【问题标题】:How to create a thread whose main function requires a reference argument?如何创建一个主函数需要引用参数的线程?
【发布时间】:2019-09-12 07:18:54
【问题描述】:

我需要在线程中创建对变量的引用。当我在下面的代码中执行此操作时,出现两个错误:

C2672: 'std::invoke': 找不到匹配的重载函数

C2893:无法专门化函数模板“unknown-type std::invoke(_Callable &&,_Types &&...) noexcept(<expr>)

如何正确编码?

#include <thread>

void foo(double a, double& b)
{
  b = a;
}

int main()
{
  double a = 0.0, b = 0.0;

  std::thread f(foo, a, b);

  f.join();
}

【问题讨论】:

标签: c++ windows multithreading reference


【解决方案1】:

这就是std::reference_wrapper 及其两个创建者函数std::refstd::cref 的用途:

std::thread f(foo, a, std::ref(b));

[Live example]

std::reference_wrapper&lt;T&gt; 是一个有效行为类似于可重新绑定引用的对象:它定义了 operator T&amp; 用于隐式转换为 T&amp;,但可以重新分配。它专门用于需要“可复制引用”的情况,例如std::bindstd::thread

使用std::ref 创建对x 的非常量引用,使用std::cref 创建对x 的常量引用。

【讨论】:

  • std::ref 适用于任何类型的指针。抱歉我之前的评论,我在我的代码中发现了一个错误。
猜你喜欢
  • 1970-01-01
  • 2019-12-08
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多