[cfe-dev] Compiling boost with -std=c++0x (and -stdlib=libc++)

Jonathan Sauer jonathan.sauer at gmx.de
Sun Jul 17 07:48:16 PDT 2011


> #include <boost/thread/thread.hpp>
> int main()
> {
>   return 0;
> }
> Actually, clang and libc++ work perfectly fine:
> [ryuta at oroppas]$ clang++ -stdlib=libc++ ./boost_thread.cpp
> However, once we deploy -std=c++0x flag,
> [ryuta at oroppas]$ clang++ -std=c++0x -stdlib=libc++ ./boost_thread.cpp 
> In file included from ./boost_thread.cpp:1:
> In file included from /usr/include/boost/thread/thread.hpp:17:
> /usr/include/boost/thread/pthread/thread_data.hpp:36:17: error: call to deleted constructor of 'boost::shared_ptr<boost::detail::tss_cleanup_function>'
>                 func(func_),value(value_)
>                 ^    ~~~~~
> /usr/include/boost/smart_ptr/shared_ptr.hpp:164:25: note: function has been explicitly marked deleted here
> template<class T> class shared_ptr

This has to do with FDIS 12.8p18 (implicitely generated copy constructors are marked as deleted if the class
provides a move constructor). After adding this constructor to boost::shared_ptr, the code compiles:

    shared_ptr( shared_ptr<T> const & r )
    : px( r.px ), pn( r.pn ) // never throws

Out-of-the-box, Boost 1.46.1's shared_ptr does not provide a copy constructor such as the one above; indeed,
on line 210 of boost/smart_ptr/shared_ptr.hpp, there is the comment stating:

    //  generated copy constructor, destructor are fine

Boost's shared_ptr only provides the following:

    template<class Y>
    shared_ptr( shared_ptr<Y> const & r )
    : px( r.px ), pn( r.pn ) // never throws

>From my reading of 12.8, this is not considered to be a copy constructor, as according to p2, only *non-template*
constructors can be copy constructors. So clang tries to generate an implicit one, but that one already has been
deleted by the move constructor shared_ptr provides.

This is not fixed in Boost's current trunk, so I guess you should file a bug with Boost.


More information about the cfe-dev mailing list