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

Dan*_*Dan 1 c++ templates pointers 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;
}
Run Code Online (Sandbox Code Playgroud)

显示失败

/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;
Run Code Online (Sandbox Code Playgroud)

正确使用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;
}
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 5

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

因此,引入了一个引用包装,它可以存储引用,同时也可以被复制。您可以使用辅助函数使用它std::refstd::cref

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

  • 有趣的一面说明:指针发生了完全相同的事情。指针已被复制,但是由于您不关心是否具有原始指针(尽管有时会这样做),因此您不会注意到副本。 (2认同)