我正在尝试使用std::unique_ptr
以将整数句柄存储到一些不透明的对象。为此,我定义了一个自定义删除器类型,typedef int pointer
以便将原始指针类型覆盖为int
而不是int*
. 此过程在本网站的最后一节中进行了描述:http: //asawicki.info/news_1494_unique_ptr_in_visual_c_2010.html
这是一些示例代码,可以更好地说明我正在尝试做的事情:
#include <memory>
#include <iostream>
static void close(int p)
{
std::cout << p << " has been deleted!" << std::endl;
}
struct handle_deleter
{
typedef int pointer;
void operator()(pointer p) { close(p); }
};
typedef std::unique_ptr< int, handle_deleter> unique_handle;
int main(int argc, char *argv[])
{
unique_handle handle(1);
return 0;
}
当我使用 GCC 4.7.2 编译此代码时,我收到以下错误:
In file included from /usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/memory:86:0,
from unique_ptr_test.cpp:1:
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/bits/unique_ptr.h: In instantiation of ‘std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = int; _Dp = handle_deleter]’:
unique_ptr_test.cpp:19:23: required from here
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/bits/unique_ptr.h:172:2: error: invalid operands of types ‘int’ and ‘std::nullptr_t’ to binary ‘operator!=’
该~unique_ptr
过程的代码如下:
// Destructor.
~unique_ptr() noexcept
{
auto& __ptr = std::get<0>(_M_t);
if (__ptr != nullptr)
get_deleter()(__ptr);
__ptr = pointer();
}
据我说,对 nullptr 的检查没有意义,因为原始指针类型是int
(而不是int*
由于在 中覆盖它HandleDeleter
)。奇怪的是,这段代码在 GCC 4.6.1 下编译没有错误。执行后,示例显示“1 已被删除!” 正如预期的那样。
我想知道是否有任何我忽略的细节,或者它是否真的是 GCC 的 unique_ptr 的 STL 实现中的错误。
谢谢,
PMJ