I have a function that returns a shared_ptr to a const object. Returning a shared_ptr constructed from a pointer returned by operator new works, but returning that pointer directly causes compilation error :
Error   3   error C2664: 'std::shared_ptr<_Ty>::shared_ptr(std::nullptr_t)' : cannot convert parameter 1 from 'script::float_data *' to 'std::nullptr_t'    c:\xxx\value.cpp    59
Here is the code causing the error :
shared_ptr< const data > float_data::operator + ( shared_ptr< const data > rhs ) const
{
    int rhs_as_int; float rhs_as_float;
    switch( rhs->to_numeric( rhs_as_int, rhs_as_float ) )
    {
    case E_INT:
        return new float_data( val + rhs_as_int );
    case E_FLOAT:
        return new float_data( val + rhs_as_float );
    }
}
And the classes are :
class data
{
public:
    enum type
    {
        E_INT,
        E_FLOAT,
        E_STRING
    };
public:
    virtual ~data() { }
public:
    virtual std::shared_ptr< const data > operator + ( std::shared_ptr< const data > rhs ) const = 0;
    virtual std::shared_ptr< const data > operator - ( std::shared_ptr< const data > rhs ) const = 0;
    virtual std::shared_ptr< const data > operator * ( std::shared_ptr< const data > rhs ) const = 0;
    virtual std::shared_ptr< const data > operator / ( std::shared_ptr< const data > rhs ) const = 0;
    virtual std::shared_ptr< data > operator = ( std::shared_ptr< const data > rhs ) = 0;
public:
    virtual type to_numeric( int & as_int, float & as_float ) const = 0;
};
class int_data : public data
{
private:
    int val;
public:
    int_data( int i );
public:
    virtual std::shared_ptr< const data > operator + ( std::shared_ptr< const data > rhs ) const;
    virtual std::shared_ptr< const data > operator - ( std::shared_ptr< const data > rhs ) const;
    virtual std::shared_ptr< const data > operator * ( std::shared_ptr< const data > rhs ) const;
    virtual std::shared_ptr< const data > operator / ( std::shared_ptr< const data > rhs ) const;
    virtual std::shared_ptr< data > operator = ( std::shared_ptr< const data > rhs );
public:
    virtual type to_numeric( int & as_int, float & as_float ) const;
};
class float_data : public data
{
private:
    float val;
public:
    float_data( float f );
public:
    virtual std::shared_ptr< const data > operator + ( std::shared_ptr< const data > rhs ) const;
    virtual std::shared_ptr< const data > operator - ( std::shared_ptr< const data > rhs ) const;
    virtual std::shared_ptr< const data > operator * ( std::shared_ptr< const data > rhs ) const;
    virtual std::shared_ptr< const data > operator / ( std::shared_ptr< const data > rhs ) const;
    virtual std::shared_ptr< data > operator = ( std::shared_ptr< const data > rhs );
public:
    virtual type to_numeric( int & as_int, float & as_float ) const;
};
class string_data : public data
{
private:
    std::string val;
public:
    string_data( const char * s );
public:
    virtual std::shared_ptr< const data > operator + ( std::shared_ptr< const data > rhs ) const;
    virtual std::shared_ptr< const data > operator - ( std::shared_ptr< const data > rhs ) const;
    virtual std::shared_ptr< const data > operator * ( std::shared_ptr< const data > rhs ) const;
    virtual std::shared_ptr< const data > operator / ( std::shared_ptr< const data > rhs ) const;
    virtual std::shared_ptr< data > operator = ( std::shared_ptr< const data > rhs );
public:
    virtual type to_numeric( int & as_int, float & as_float ) const;
};
I don't think this is something specific to C++11, but i'm new to C++11 so i'm not sure. I don't understand why not both ways to return the pointer works and why the compiler automatically chooses the constructor expecting a nullptr_t.
 
    