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
、それが機能しない 2 つの問題があることがわかります。1つ目は、明らかに標準に違反しているように見えますが、初期化されているかどうかを確認するために、デストラクタunique_ptr
が「ポインタ」(私の定義によればint)を比較することです。nullptr
これは、"pointer()"
(初期化されていない「ポインター」) と比較するブール変換によって報告する方法とは対照的です。これが私が見ているエラーの原因です - 整数はnullptr
.
2 番目の問題は、初期化されunique_ptr
ていない値が何であるかを伝える何らかの方法が必要なことです。次のスニペットを機能させたい:
unique_fd fd( open(something...) );
if( !fd )
throw errno_exception("Open failed");
それが機能するにunique_ptr
は、ゼロが有効なファイル記述子であるため、「初期化されていない値」が -1 であることを知る必要があります。
これは のバグですかgcc
、それとも単に実行できないことをここで行おうとしていますか?