[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
Hello,
> #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.
Jonathan
More information about the cfe-dev
mailing list