Инициализация умных указателей

445
09 февраля 2017, 00:49

std::unique_ptr<X> ptr;

Будет ли ptr == nullptr возвращать true для любого типа X?

struct A {std::unique_ptr<X> ptr;}

A; A(); A{};

А в таких случаях для A.ptr?

Answer 1

Стандарт явно говорит о конструкторе unique_ptr по умолчанию:

2 Effects: Constructs a unique_ptr object that owns nothing, value-initializing the stored pointer and the stored deleter.
3 Postconditions: get() == nullptr. get_deleter() returns a reference to the stored deleter.

Так что да.

В качестве примера:

struct A {std::unique_ptr<char> ptr;};
int main(int argc, const char * argv[])
{
    unique_ptr<int> x;
    cout << (x == nullptr) << endl;
    A a;
    A b{};
    cout << (a.ptr == nullptr) << endl;
    cout << (b.ptr == nullptr) << endl;
}
Answer 2

@Harry уже описал, как ведёт себя конструктор по умолчанию для std::unique_ptr. Я же хочу добавить, что типа, имеющего конструктор, совершенно не важно как вы будете определять переменную:

A a1;
A a2 = A();
A a3 = A{};

Во всех случаях будет вызван конструктор A по умолчанию, который в данном случае вызовет конструктор std::unique_ptr по умолчанию для члена ptr.

Особое внимание можно уделить разве что записям вида:

A a4();
A a5{};

В случае a4 не будет создана никакого объекта, а будет всего лишь объявление функции с именем a4, не принимающей аргументов и возвращающей тип A. В случае a5 создастся объект, идентичный a1, a2, a3.

Про a4 более подробно можно ознакомиться в вики: Most vexing parse.

READ ALSO
Проблема с OpenCV - undefined reference

Проблема с OpenCV - undefined reference

Решил изучить OpenCV

483
Декомпиляция приложения в Unreal Engine 4 под Windows [требует правки]

Декомпиляция приложения в Unreal Engine 4 под Windows [требует правки]

Не знаю как редактировать готовое скомпилированное приложениеБыл вариант из скомпилированных файлов сделать проект, но у меня ничего не получилось...

465
как изменить под динамический массив?

как изменить под динамический массив?

не могу переделать под динамический массив, чтобы из файла без проблем можно было любого размера текст использовать в программе ( удаляет...

359
Не коректное чтение значения из std::cin в std::string

Не коректное чтение значения из std::cin в std::string

При считывании потока из командной строки в переменную с помощью std::getline не дает ввести данные, перескакиваетКак можно считать строку с пробелами...

301