Отлично. Это просто макрос NULL
(который в большинстве компиляторов расширяется до 0
) и вызывает проблему. 0
соответствует конструкторам nullptr_t
и T*
unique_ptr
, поэтому он неоднозначен и не компилируется.
При инициализации unique_ptr
переменной-указателем или возвращаемым значением функции не имеет значения, использовались ли nullptr
, NULL
или 0
. Все они имеют одинаковый эффект: нулевой указатель:
Это прекрасно, например,
int* int_p1 = NULL;
int* int_p2 = (int*)malloc(sizeof(int));
unique_ptr<int, decltype(&free)> a1(int_p1, free);
unique_ptr<int, decltype(&free)> a2(int_p2, free);
Примечание: если вы не взаимодействуете с функциями C, которые использовали для выделения malloc()
, но с функциями C ++, которые использовали new
, не используйте пользовательские средства удаления. Средство удаления по умолчанию unique_ptr
уже использует delete
.