S1l*_*0rm 9 c++ unique-ptr visual-c++
这个例子用gcc 4.8.3编译并运行良好:
#include <memory>
#include <functional>
#include <iostream>
int main() {
auto str = new const char[6]{'h', 'e', 'l', 'l', 'o', '\0'};
std::unique_ptr<const char[], std::function<void(const char *)>> u_ptr(str, [](const char *s){ delete[] s; });
std::cout << u_ptr.get() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用Visual Studio Professional 2013时,它无法编译(抱怨已删除的功能).Visual Studio 2013还没有这个功能吗?或者我的示例代码是错误的,gcc忽略了我的错误?
错误是:
main.cpp(8):错误C2280:'std :: unique_ptr> :: unique_ptr>(_ Ptr2,_Dx2)':尝试用[_Ptr2 = const char*,_Dx2 = main ::] C:引用已删除的函数程序文件(x86)\ Microsoft Visual Studio 12.0\VC\INCLUDE\memory(16 16):请参阅'std :: unique_ptr> :: unique_ptr'的声明
这似乎是Visual C++ 2013标准库中的一个缺陷.我无法在2015年重现这个问题.
该unique_ptr班有这个构造函数采用指针和删除器:
unique_ptr(pointer _Ptr,
typename _If<is_reference<_Dx>::value, _Dx,
const typename remove_reference<_Dx>::type&>::type _Dt) _NOEXCEPT
: _Mybase(_Ptr, _Dt)
{ // construct with pointer and (maybe const) deleter&
}
Run Code Online (Sandbox Code Playgroud)
但是,unique_ptr<T[]>专业化也有一个包罗万象的构造函数:
template<class _Ptr2,
class _Dx2>
unique_ptr(_Ptr2, _Dx2) = delete;
Run Code Online (Sandbox Code Playgroud)
此版本优于前一版本.
但是,因为非专业化unique_ptr根本没有它,所以u_ptr改为a const char而不是const char[]修复问题.
像你正在做的那样使用带有删除器的数组版本也是不必要的:
如果你想调用delete[]指针,那么数组已经有了专门化.您不需要自定义删除器.
如果您想要做其他事情,您应该使用非专业版.