Что происходит, когда std :: make_unique <T>() присваивает std :: unique_ptr <T>? - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть одно сомнение в std :: unique_ptr.

Когда мы назначаем std :: make_unique () без аргументов, что произойдет?

Например,

struct A {
  int a, b;
  A() {}
  A(int w, int e) : a(w), b(e) {}
};

int main() {
   A h(1, 2);
   std::unique_ptr<A> hello = std::make_unique<A>();
   std::cout << hello->a << std::endl;
}

В приведенном выше коде, я упомянул конструктор по умолчанию, я получил вывод hello-> a в качестве значения мусора (случайное отрицательное значение)

Но, когда я изменяю структуру, как показано ниже,

struct A {
  int a, b;
  A() {a=0;b=0;}
  A(int w, int e) : a(w), b(e) {}
};

Результирующее значение hello-> a как 0.

Почему конструктор по умолчанию не назначает int как 0 при использовании std :: make_unique ()?

1 Ответ

0 голосов
/ 31 декабря 2018

Аргументы, переданные std::make_unique<A>(), являются аргументами, переданными соответствующему конструктору A.Здесь вы не предоставляете ничего, поэтому будет вызван конструктор по умолчанию A.

Почему конструктор по умолчанию не назначает int как 0 при использовании std :: make_unique ()?

Члены встроенного типа, которые не инициализированы, остаются с неопределенным значением.Это поведение не связано ни с std::unique_ptr, ни с std::make_unique;это только то, как встроенные типы инициализируются по умолчанию.

Инициализируйте их:

struct A {
  int a, b;
  A(): a(0), b(0) {}
  A(int w, int e) : a(w), b(e) {}
};
...