我試圖使用std::unique_ptr
爲了將整數句柄存儲到一些不透明的對象。爲此,我已經定義了一個自定義刪除類型,它的作用是將typedef int pointer
覆蓋原始指針類型爲int
而不是int*
。這個過程在這個網站的最後一節中描述:http://asawicki.info/news_1494_unique_ptr_in_visual_c_2010.html在GCC 4.7.2中破壞std :: unique_ptr
下面是一些示例代碼,以更好地說明什麼,我試圖做的:
#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的STL實現unique_ptr內的錯誤。
感謝,
PMJ
臨提示:第一次搜索的某些語義在一個表,其中列出*你的*代碼/理解錯誤,並且不會立即責怪實施被「破壞」。現在,'Deleter :: pointer'必須滿足* Nullable Pointer *要求。這包括比較'nullptr',因爲'std :: unique_ptr'被指定爲只在get()!= nullptr'時調用deleter。 IOW,你只需要包裝你的'int'並將其用作'pointer'類型。 – Xeo
'std :: unique_ptr'表示指向T *的*指針。沒有辦法讓'std :: unique_ptr :: pointer'是'int'。換句話說,您忘記了應用於第一個模板參數的隱式星號。 –
GManNickG
@Xeo:爲什麼不是一個答案! :-) –