智能指针r值ref转换运算符

时间:2016-03-05 18:33:15

标签: c++ c++11 operator-overloading implicit-conversion rvalue-reference

我试图编写一个可以轻松上传的智能指针,但我在上传r值参考时遇到了麻烦。请考虑以下事项:

#include <utility>

template<typename T>
class SmartPtr
{
    T* impl_;

public:
    // ...

    template<typename U>
    operator SmartPtr<U>&&() &&
    {
        U* u = impl_; // Fail with a nice error message if T* isn't implicitly convertable to U*;
        return reinterpret_cast<SmartPtr<U>&&>(*this);
    }

    // ...
};

struct A {};
struct B : public A {};

int main()
{
    SmartPtr<B> pb;
    SmartPtr<A>&& pa = std::move(pb);
}

这在Visual C ++ 2015中失败,并显示以下错误消息:

error C2440: 'initializing': cannot convert from 'SmartPtr<B>' to 'SmartPtr<A> &&'
note: Reason: cannot convert from 'SmartPtr<B>' to 'SmartPtr<A>'
note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

注意:这适用于Clang 3.4和更简单的版本(例如,包装类可隐式转换为内部值的r-value-ref)在Visual Studio 2015中工作。

我应该按照标准做什么工作?这是Visual Studio 2015中的错误吗?

0 个答案:

没有答案