On 30/01/14 14:23, Gavin Lambert wrote:
Mere moments ago, quoth I:
On 30/01/2014 15:13, Quoth Ben Pope:
// invoke g with empty object g(shared_ptr<CSomeReallyLongClassName>());
g(0); [...] (Also, the above doesn't compile in 1.53 because the raw pointer constructor is marked explicit. Again, maybe that's been changed in the interim.)
Whoops, You're right. I did test it, but I think I compiled it in C++11 mode!
If you're using a C++11 compiler you should be able to use this though:
g(nullptr);
Yes, of course. Internally boost::shared_ptr uses
boost::detail::sp_nullptr_t, which in C++11 is a typedef of
std::nullptr_t, there appears to be no alternative for C++98, which is a
shame.
I don't see why that type couldn't be defined to an empty struct in
C++98 mode.
Then, removing the #if !defined( BOOST_NO_CXX11_NULLPTR ) guard from the
constructor of shared_ptr that accepts a boost::detail::sp_nullptr_t
does indeed seem to work.
namespace boost {
namespace detail {
struct sp_nullptr_t {};
}
const detail::sp_nullptr_t nullptr = detail::sp_nullptr_t();
}
#include