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