Передача по ссылке - почему этот деструктор называется? - PullRequest
0 голосов
/ 26 октября 2018

Я не смог найти (из многих вопросов по темам вызова деструкторов), которые были бы точно такими же, как моя ситуация.

Почему деструктор вызывается, когда переданный параметр является ссылкой? Я помещаю комментарии (в основном в main) под строками кода, где я думал, что вывод выполняется из.

struct X { // simple test class
   int val;

   void out(const std::string& s, int nv)
   {
      std::cerr << this << "–>" << s << ": " << val << " (" << nv << ")\n";
   }

   // default constructor
   X() { 
      out("X()", 0); 
      val = 0; 
   } 

   X(int v) { 
      val = v; 
      out("X(int)", v); 
   }

   // copy constructor
   X(const X& x) {
      val = x.val; 
      out("X(X&) ", x.val); 
   } 

   // copy assignment
   X& operator=(const X& a)
   {
      out("X::operator=()", a.val); 
      val = a.val; 
      return *this;
   }

   // Destructor
   ~X() { 
      out("~X()", 0); 
   }
};

X glob(2); // a global variable
// Output Line 1: X(int): 2 (2)

X copy(X a) { 
   return a; 
}

main Функция:

    int main()
{
   X loc{ 4 }; // local variable
      // Output Line 2: X(int): 4 (4)
      // ^from X(int v) function
   X loc2{ loc }; // copy construction
      // Output Line 3: X(X&) : 4 (4)
      // ^from X(const X& x) function
   loc = X{ 5 }; // copy assignment 
      // Output Line 4: X(int): 5 (5)
      // ^from X(int v) function
      // Output Line 5: X::operator=(): 4 (5)
      // ^from the '=' operator overload
      // Output Line 6: ~X(): 5 (0) - ???
   loc2 = copy(loc); // call by value and return 
      // Or does Output Line 6 result from here?
   .
   .
   .
}

1) Этот деструктор вызывается из-за loc = X{ 5 }; // copy assignment или строки после: loc2 = copy(loc); // call by value and return?

2) Почему это называется? Из того, что я прочитал, деструкторы называются только когда:

a) names go out of scope
b) program terminates
c) "delete" is used on a pointer to an object

Я знаю, что это не «b» или «c», так что должно быть, потому что что-то выходит за рамки. Но я не думаю, что ссылка, выходящая из области видимости из функции копирования, делает это.

1 Ответ

0 голосов
/ 26 октября 2018

Вы можете видеть, что деструктор вызывается вскоре после назначения копирования.После завершения копирования копия временного (x{5}) уничтожается.

Из раздела стандарта по деструкторам:

15,4 Деструкторы
...
12.Деструктор вызывается неявно
(12.1) - для построенного объекта со статической продолжительностью хранения при завершении программы,
(12.2) - для построенного объекта с продолжительностью хранения потока при выходе из потока,
(12.3) - для построенного объекта с автоматической продолжительностью хранения при выходе из блока, в котором создан объект,
(12.4) - для построенного временного объекта по окончании срока его службы.

...