Прежде всего, я знаю, что мы должны использовать std::make_unique()
вместо вызова конструктора std::unique_ptr
, и я знаю почему.
Но я смотрел документацию std::unique_ptr
, чтобы скоротать времяи отточить мои знания об этом, и я нашел следующие примеры об использовании конструктора:
// unique_ptr constructor example
#include <iostream>
#include <memory>
int main () {
std::default_delete<int> d;
std::unique_ptr<int> u1;
std::unique_ptr<int> u2 (nullptr);
std::unique_ptr<int> u3 (new int);
std::unique_ptr<int> u4 (new int, d);
std::unique_ptr<int> u5 (new int, std::default_delete<int>());
std::unique_ptr<int> u6 (std::move(u5));
std::unique_ptr<int> u7 (std::move(u6));
std::unique_ptr<int> u8 (std::auto_ptr<int>(new int));
std::cout << "u1: " << (u1?"not null":"null") << '\n';
std::cout << "u2: " << (u2?"not null":"null") << '\n';
std::cout << "u3: " << (u3?"not null":"null") << '\n';
std::cout << "u4: " << (u4?"not null":"null") << '\n';
std::cout << "u5: " << (u5?"not null":"null") << '\n';
std::cout << "u6: " << (u6?"not null":"null") << '\n';
std::cout << "u7: " << (u7?"not null":"null") << '\n';
std::cout << "u8: " << (u8?"not null":"null") << '\n';
return 0;
}
Он генерирует (и я подтвердил это, выполняя код) следующие результаты:
u1: нольu2: нольu3: не нольu4: не нольu5: нольu6: нольu7: не нольu8: не ноль
Я пытаюсь понять, что:
- Почему
u4
действителен, в то время как u5
недействителен (nullptr
)? - Почему
u7
допустимо, но не u6
?
Возможно, эти вопросы очень простые, но я полностью упускаю суть.
Если кто-то можетпросветите меня по этим вопросам, я был бы признателен.