This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: c++11 / unique_ptr with packaged_task
- From: Jonathan Wakely <jwakely dot gcc at gmail dot com>
- To: NightStrike <nightstrike at gmail dot com>
- Cc: gcc-help <gcc-help at gcc dot gnu dot org>, zao at acc dot umu dot se
- Date: Fri, 1 Mar 2013 10:35:05 +0000
- Subject: Re: c++11 / unique_ptr with packaged_task
- References: <CAF1jjLtfmgppnNyPrHNt=CzctU7yH8kgO3H56C4AVf5eve=+5Q@mail.gmail.com>
On 1 March 2013 06:21, NightStrike wrote:
> This code compiles with clang/libc++, but doesn't with gcc4.8/libstdc++:
>
> #include <functional>
> #include <future>
> #include <iostream>
> #include <memory>
> #include <ostream>
>
> struct S
> {
> void f()
> {
> std::cerr << "Meep meep\n";
> }
> };
>
> int main()
> {
> std::unique_ptr<S> sp(new S);
> std::packaged_task<void ()> pt(std::bind(&S::f, std::move(sp)));
> pt();
> std::cerr << "sp is empty: " << std::boolalpha << !sp << std::endl;
> }
>
>
>
> Is that a bug in gcc?
The problem is that I implemented packaged_task using a std::function
to hold the stored task, and std::function requires a
CopyConstructible target object, but your function object is only
MoveConstructible.
This is a GCC bug, I think I can see an easy way to fix it, but it
will have to wait for 4.8.1 because it's not a regression.