c++ - 为什么 std::async 不能与接收抽象类引用作为参数的函数一起使用?

标签 c++ pointers templates reference abstract

我正在尝试通过 std::async 执行一个接收参数的函数,该参数是对抽象类的引用,但由于某种原因,这似乎无效。另一方面,如果我用指针替换提到的引用,一切正常。

为什么会这样?将抽象类参数作为指针传递通常更好吗?

请看下面的例子:

std::async 的错误使用

#include <iostream>
#include <future>

class AbsClass {
  public:
    virtual int f() = 0;
};

class ImplClass : public AbsClass {
  public:
    int f() override { return 21; }
};

int func(AbsClass &asbclass) {
  return 210 + asbclass.f();
}

int main() {
  ImplClass ic;
  AbsClass &ac = ic;

  // This causes a compilation failure:
  std::future<int> res = std::async(&func, ac);

  std::cout << res.get() << std::endl;
}

失败显示

/usr/include/c++/7/future:1745:5: error: invalid abstract parameter type ‘AbsClass’
main.cpp:4:7: note:   because the following virtual functions are pure within ‘AbsClass’:
 class AbsClass {
       ^~~~~~~~
main.cpp:6:17: note:    virtual int AbsClass::f()
     virtual int f() = 0;

std::async 的正确使用

#include <iostream>
#include <future>

class AbsClass {
  public:
    virtual int f() = 0;
};

class ImplClass : public AbsClass {
  public:
    int f() override { return 21; }
};

int func(AbsClass *asbclass) {
  return 210 + asbclass->f();
}

int main() {
  ImplClass ic;
  AbsClass &ac = ic;

  std::future<int> res = std::async(&func, &ac);

  std::cout << res.get() << std::endl;
}

最佳答案

参数需要被存储,这意味着它们被复制。并且不能复制引用。

因此 reference wrapper被引入,它可以存储引用,同时也可以被复制。您可以将它与辅助函数 std::ref and std::cref 一起使用:

std::future<int> res = std::async(&func, std::ref(ac));  // Pass ac by reference

关于c++ - 为什么 std::async 不能与接收抽象类引用作为参数的函数一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56924920/

相关文章:

c++ - 无法解析的外部符号 : __cairo_path_fixed_stroke_to_traps

c++ - 接口(interface)是 C++ 中的一个好习惯吗?

c++ - 如何定义类类型到函数指针的转换?

c - 为什么内存中的下一个短路具有另一个变量的值?

c++ - 我可以将指向 char 指针的指针直接分配给字符串文字吗?

c++ - 在编译时将枚举与模板类相关联

C++ 如何读取目录中的所有.txt 文件?

pointers - 在迭代器上的 `for` 循环内的结构上使用其他方法,这可以改变该结构

此类的 C++ 特征示例

c++ - 如何为引用参数定义模板函数和为指针参数定义相同的函数