此示例使用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;
}
但是当我尝试使用Visual Studio Professional 2013时,它无法编译(抱怨已删除的功能)。 Visual Studio 2013还没有这个功能吗?或者我的示例代码是错误的,gcc忽略了我的错误?
错误是:
main.cpp(8):错误C2280:'std :: unique_ptr&gt; :: unique_ptr&gt;(_ Ptr2,_Dx2)': 试图引用已删除的功能 同 [ _Ptr2 = const char *,_ Dx2 = main :: ] C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ VC \ INCLUDE \ memory(16 16):参见'std :: unique_ptr&gt; :: unique_ptr'的声明
答案 0 :(得分:6)
这似乎是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&
}
但是,unique_ptr<T[]>
专门化也有一个包罗万象的构造函数:
template<class _Ptr2,
class _Dx2>
unique_ptr(_Ptr2, _Dx2) = delete;
此版本优于前一版本。
但是,由于非专业unique_ptr
根本没有,将u_ptr
更改为const char
而不是const char[]
可以解决问题。
将数组版本与您正在执行的删除器一起使用也是不必要的:
如果要在指针上调用delete[]
,则已经有了数组专门化。您不需要自定义删除工具。
如果您想做其他事情,您应该使用非专业版。