#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
для государства, не принадлежащего государству.