Конструктор — вызов функции уничтожает возвращаемый объект, даже если он явно не создан? Переполнение стека

Поэтому я вызываю перегруженное сложение двух объектов Word с

Word w;
w+w;

Декларация и определение:

Sentence operator+(const Word&) const;

Sentence Word::operator+(const Word& rightWord) const{
std::cout<<"Entering function Word::operator+(const Word&)."<<std::endl;
std::cout<<"Leaving function Word::operator+(const Word&).\n"<<std::endl;
}

После выполнения w + w объект Sentence деконструируется (я перегрузил деструктор для печати на стандартный вывод). Я ранее создал объект предложения, но не думаю, что это влияет на него. Я не понимаю, как объект предложения разрушается, когда он даже не был создан (перегружен конструктор по умолчанию). Я также не понимаю, почему это будет создано, так как я даже не возвращаю его. Я запустил его через GDB, и он определенно вызывает деструктор предложения, когда он выходит из функции сложения. Я могу предоставить больше кода, просто подумал, что кто-то может знать проблему без него.

0

Решение

Это неопределенное поведение если ничего не возвращается изvoid функция. Все наблюдаемые вами эффекты не определены языком C ++, специфичны для вашего компилятора и / или случайны.

Фактически, ваш компилятор должен выдать предупреждающее сообщение для этого фрагмента кода или даже ошибку. Например, следующее производит error C4716: 'Word::operator+': must return a value с Visual C ++ 2015:

#include <iostream>

struct Sentence {};

struct Word {
Sentence operator+(const Word&) const;
};

Sentence Word::operator+(const Word& rightWord) const{
std::cout<<"Entering function Word::operator+(const Word&)."<<std::endl;
std::cout<<"Leaving function Word::operator+(const Word&).\n"<<std::endl;
} // error C4716

int main() {
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector