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();
}
int
私によると、生のポインタ型は(でint*
オーバーライドするためではなく)であるため、nullptrに対するチェックは意味がありませんHandleDeleter
。不思議なことに、このコードはGCC4.6.1でエラーなしでコンパイルされます。実行すると、サンプルには「1が削除されました!」と表示されます。予想通り。
私が見落としている詳細があるのか、それともGCCのunique_ptrのSTL実装内のバグなのか疑問に思いました。
ありがとう、
PMJ