返回函数返回一个shared_ptr的新东西

Vir*_*721 0 c++ constructor return shared-ptr implicit-conversion

我有一个函数将shared_ptr返回给const对象.返回由operator new返回的指针构造的shared_ptr,但返回该指针会导致编译错误:

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
Run Code Online (Sandbox Code Playgroud)

以下是导致错误的代码:

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 );
    }
}
Run Code Online (Sandbox Code Playgroud)

这些课程是:

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;
};
Run Code Online (Sandbox Code Playgroud)

我不认为这是C++ 11特有的东西,但我是C++ 11的新手,所以我不确定.我不明白为什么两种返回指针的方法都不起作用,以及为什么编译器会自动选择期望nullptr_t的构造函数.

vso*_*tco 5

这是因为构造函数std::shared_ptr是显式的,因此在返回语句中,编译器std::shared_ptr在尝试构造返回的对象时无法将原始指针隐式转换为隐式指针.你必须返回一个std::shared_ptr.

您看到奇怪的错误,因为编译器尝试将原始指针参数与非显式构造函数匹配(此处为数字5)

constexpr shared_ptr( std::nullptr_t );
Run Code Online (Sandbox Code Playgroud)

虽然g ++/clang ++在诊断问题方面更有帮助,但示例错误:

错误:无法从'int*'转换为'std :: shared_ptr'