我想移动一个NULLstd::unique_ptr to a std::shared_ptr,像这样:
std::unique_ptr<float> test = nullptr;
std::shared_ptr<float> test2 = std::move(test);
据我所知,这样做应该是合法的,并且它在 Visual Studio 2015 和 GCC 中运行良好。
但是,我不能对 a 做同样的事情std::unique_ptr它有一个删除器声明,如下所示:
std::unique_ptr<float,void(*)(float*)> test = nullptr;
std::shared_ptr<float> test2 = std::move(test);
上面的代码不会在 Visual Studio 中编译,并且会触发静态断言失败“错误 C2338:使用空删除器指针构造的 unique_ptr”。
我可以用一个标准::函数相反,在这种情况下可以避免静态断言失败:
std::unique_ptr<float,std::function<void(float*)>> test = nullptr;
std::shared_ptr<float> test2 = std::move(test);
在这种情况下,代码编译得很好,但我在最后一次运行时就中止了std::shared_ptr备份test2被摧毁了。
为什么后两种情况会出现如此大的问题?
奇怪的是,如果我改变类型test2 from std::shared_ptr to std::unique_ptr,第二种情况仍然会触发静态断言失败,但情况 1 和情况 3 都工作得很好:
{
std::unique_ptr<float> test = nullptr;
std::unique_ptr<float> test2 = std::move(test); // Works fine
}
{
//std::unique_ptr<float,void(*)(float*)> test = nullptr; // triggers a static assert failure
//std::unique_ptr<float,void(*)(float*)> test2 = std::move(test);
}
{
std::unique_ptr<float,std::function<void(float*)>> test = nullptr;
std::unique_ptr<float,std::function<void(float*)>> test2 = std::move(test); // Works fine
}