我试图编写一个可以轻松上传的智能指针,但我在上传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中的错误吗?