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

C++ 智能指针r值ref转换运算符,c++,c++11,operator-overloading,implicit-conversion,rvalue-reference,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>&&() && {

我试图编写一个智能指针,可以很容易地向上转换,但在向上转换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);
}
#包括
模板
类SmartPtr
{
T*impl_u2;;
公众:
// ...
模板
操作员SmartPtr&()&&
{
U*U=impl_;//如果T*不能隐式转换为U*,则失败并显示一条漂亮的错误消息;
返回重新解释的铸件(*本);
}
// ...
};
结构A{};
结构B:公共A{};
int main()
{
智能ptr-pb;
SmartPtr&&pa=std::move(pb);
}
这在VisualC++ 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
错误C2440:“正在初始化”:无法从“SmartPtr”转换为“SmartPtr&&”
注意:原因:无法从“SmartPtr”转换为“SmartPtr”
注意:没有可执行此转换的用户定义的转换运算符,或者无法调用该运算符
注意:这适用于Clang 3.4和更简单的版本(例如,包装类隐式转换为内部值的r-value-ref),适用于Visual Studio 2015


我要做的工作应该符合标准吗?这是Visual Studio 2015中的一个bug吗?

重新解释cast(*此)
这毫无意义。非正式地说,通常情况下,在
U*U=impl
之后,
U
impl
引用相同的地址,并由相同的位模式表示。因此,基本上,即使您找到了一种方法来ram这个强制转换,这种方法也不会起作用。只需按值返回
SmartPtr
。我曾简要考虑过这一点,但将其视为只在多重继承中发生的事情,而我在项目中没有这样做。还有其他我没想到的案子吗?我不认为我看到的错误与此相关,但是,因为非r-value-ref版本按预期工作。让我看看是否可以提供一个没有任何不安全强制转换的示例。
仅在多重继承时发生。这种情况也会发生:
class a{};B类:公共A{virtual void f(){}无论如何,如果你坚持危险地生活,我怀疑这样的事情会“起作用”:
return std::move(*reinterpret_cast(this))否,完全相同的错误。我不坚持过危险的生活。这现在更多的是好奇,而不是一个疑难解答问题。