删除带有自定义删除器的unique_ptr构造函数

时间:2015-06-01 16:24:48

标签: c++ visual-c++ unique-ptr

此示例使用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'的声明

1 个答案:

答案 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[]可以解决问题。

将数组版本与您正在执行的删除器一起使用也是不必要的:

  1. 如果要在指针上调用delete[],则已经有了数组专门化。您不需要自定义删除工具。

  2. 如果您想做其他事情,您应该使用非专业版。