Я не смог найти (из многих вопросов по темам вызова деструкторов), которые были бы точно такими же, как моя ситуация.
Почему деструктор вызывается, когда переданный параметр является ссылкой? Я помещаю комментарии (в основном в 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», так что должно быть, потому что что-то выходит за рамки. Но я не думаю, что ссылка, выходящая из области видимости из функции копирования, делает это.