2016-10-08 9 views
0

Так я называю перегруженное сложением двух объектов слова сФункция вызова разрушает объект возврата, даже если он явно не создан? C++

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; 
} 

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

+0

Ваша функция объявлена ​​возвращать 'Sentence', следовательно, это' Sentence' должен быть построен и разрушен в какой-то момент – tkausl

+0

я перегружен конструктор по умолчанию и не был вызван, только деструктор. И когда он прошел через gdb, я никогда не попадал в конструктор @tkausl –

+2

Это просто UB, ничего невозможного. См. [Что происходит, когда функция, возвращающая объект, заканчивается без оператора возврата) (http://stackoverflow.com/questions/39118324/what-happens-when-a-function-that-returns-an-object-ends- no-a-return-statem/39118529 # 39118529) – songyuanyao

ответ

0

Это undefined поведение, если ничего не возвращается с функции не 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() { 
}