Welcome to Software Development on Codidact!
Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.
Post History
On the cppreference page for std::async, there's an example where the object for a PMF invocation is passed by value. So clearly, that is okay; in fact there is nothing on the cppreference page say...
Answer
#1: Initial revision
On the [cppreference page for `std::async`](https://en.cppreference.com/w/cpp/thread/async), there's an example where the object for a PMF invocation is passed by value. So clearly, that is okay; in fact there is nothing on the cppreference page saying it has to be a reference. However, in your example, you've only got passing by value (`x`) and passing by pointer (`&x`); you can also pass by reference using `std::ref(x)`. Here, I modified your example to show this to better effect: ```cpp #include <future> #include <iostream> #include <thread> struct X { X() noexcept { std::cerr << "X::X()\n"; } X(X const&) noexcept { std::cerr << "X::X(X const&)\n"; } ~X() noexcept { std::cerr << "X::~X()\n"; } void add(int num1, int num2) noexcept { int result = num1 + num2; std::cout << "The result is " << result << "\n"; } }; int main() { X x; std::cerr << "\nBy reference:\n"; std::async(&X::add, std::ref(x), 42, 5).get(); std::cerr << "\nBy pointer:\n"; std::async(&X::add, &x, 42, 5).get(); std::cerr << "\nBy value:\n"; std::async(&X::add, x, 42, 5).get(); std::cerr << "\nAll done!\n"; } ```