значение по умолчанию unique_ptr

#c #gcc #unique-ptr

Вопрос:

Мне трудно понять значение по умолчанию unique_ptr.
Из ссылки cpp я вижу, что есть два конструктора unique_ptr, которые говорят, что ему ничего не принадлежит
Ничего не означает nullptr?

 constexpr unique_ptr() noexcept;
constexpr unique_ptr( std::nullptr_t ) noexcept;
 

Я создал небольшой пример ниже. Если я проверю значение nullptr, оно вернет значение true. Гарантировано ли такое поведение?

 #include <memory>
#include <vector>
#include <iostream>

class A {
  public:
    A(int i) :m_i(i) {}
    ~A() {}
    int getI() { return m_i; }
  private:
    int m_i;
};

int main() {
    std::unique_ptr<A> a;
    if(a == nullptr) {
     std::cout << "A is nulln";   
    }
    std::vector<std::unique_ptr<A>> vec;
    vec.resize(5);
    for(size_t i = 0; i < vec.size(); i  ) {
        if(vec[i] == nullptr) {
            std::cout << "Nullptr" << std::endl;   
        }
    }
    return 0;
}
 

O/p вышеуказанного кода в моей системе (gcc) является

 A is null
Nullptr
Nullptr
Nullptr
Nullptr
Nullptr
 

Если я проверю значение null на неинициализированном unique_ptr, гарантируется ли, что оно будет равно nullptr? Или это определено реализацией?

Комментарии:

1. nullptr-это nullptr, а не ничего. nullptr ни на что не указывает.

Ответ №1:

Для этих двух перегрузок конструктора:

 constexpr unique_ptr() noexcept;
constexpr unique_ptr(std::nullptr_t) noexcept;
 

В документации говорится, что эти два конструктора выше создают std::unique_ptr объект, которому ничего не принадлежит.

Теперь, просмотрев документацию std::unique_ptr функции- get() члена:

Возвращает указатель на управляемый объект или nullptr , если объект не принадлежит.

Поскольку std::unique_ptr объекты, созданные с помощью любого из этих двух конструкторов, ничем не владеют, мы приходим к выводу, что get() nullptr для этих std::unique_ptr объектов возвращается.

Ответ №2:

«ничто» в этом контексте означает государство, не принадлежащее государству.

Сам указатель инициализируется значением (что для обычных указателей приводит к нулевому указателю), см. [unique.ptr.single.ctor]:

constexpr unique_ptr() noexcept;
. . .

2 Эффекта: Создает unique_ptr объект, которому ничего не принадлежит, инициализирует значение сохраненного указателя и сохраненного удалителя.

3 Постусловия: get() == nullptr . get_deleter() возвращает ссылку на сохраненный удалитель.

Таким unique_ptr::get() образом, гарантируется возврат nullptr для государства, не принадлежащего государству.