理论上,我应该能够使用自定义指针类型和删除器来unique_ptr
管理不是指针的对象。我尝试了以下代码:
#ifndef UNIQUE_FD_H
#define UNIQUE_FD_H
#include <memory>
#include <unistd.h>
struct unique_fd_deleter {
typedef int pointer; // Internal type is a pointer
void operator()( int fd )
{
close(fd);
}
};
typedef std::unique_ptr<int, unique_fd_deleter> unique_fd;
#endif // UNIQUE_FD_H
这不起作用(带有-std=c++11
参数的 gcc 4.7)。它响应以下错误:
In file included from /usr/include/c++/4.7/memory:86:0,
from test.cc:6:
/usr/include/c++/4.7/bits/unique_ptr.h: In instantiation of 'std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = int; _Dp = unique_fd_deleter]':
test.cc:22:55: required from here
/usr/include/c++/4.7/bits/unique_ptr.h:172:2: error: invalid operands of types 'int' and 'std::nullptr_t' to binary 'operator!='
通过深入研究 的定义unique_ptr
,我可以看到阻止它工作的两个问题。第一个似乎明显违反标准,析构函数unique_ptr
将“指针”(根据我的定义,即一个 int)与它进行比较nullptr
,以查看它是否已初始化。这与它通过布尔转换报告它的方式形成对比,布尔转换是将它与"pointer()"
(未初始化的“指针”)进行比较。这是我看到的错误的原因 - 整数与nullptr
.
第二个问题是我需要一些方法来判断unique_ptr
未初始化的值是什么。我希望以下代码段起作用:
unique_fd fd( open(something...) );
if( !fd )
throw errno_exception("Open failed");
为此,unique_ptr
需要知道“未初始化的值”是-1,因为零是有效的文件描述符。
这是一个错误gcc
,还是我想在这里做一些根本无法完成的事情?