https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106695
Bug ID: 106695
Summary: Regression 11,12: Explicit copy constructor does not
work for a parameter passed via std::async
Product: gcc
Version: 12.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: fchelnokov at gmail dot com
Target Milestone: ---
This program:
```
#include <future>
struct A {
A() = default;
explicit A(const A &) = default;
};
void foo(const A &) {}
int main() {
auto f = std::async(std::launch::async, foo, A{});
}
```
is accepted in GCC 10, MSVC and Clang with libc++, but not in GCC 11/12:
error: could not convert '{std::forward<void (&)(const A&)>((* & __args#0)),
std::forward<A>((* & __args#1))}' from '<brace-enclosed initializer list>' to
'std::tuple<void (*)(const A&), A>'
1693 | _M_fn{{std::forward<_Args>(__args)...}}
Online demo: https://gcc.godbolt.org/z/nMn33PTbd
Related discussion: https://stackoverflow.com/q/73417828/7325599