Это похоже на глупый вопрос, но это точный момент, когда return xxx; "выполняется" в функции, однозначно определенной?
Пожалуйста, посмотрите следующий пример, чтобы увидеть, что я имею в виду (здесь живут):
#include <iostream>
#include <string>
#include <utility>
//changes the value of the underlying buffer
//when destructed
class Writer{
public:
std::string &s;
Writer(std::string &s_):s(s_){}
~Writer(){
s+="B";
}
};
std::string make_string_ok(){
std::string res("A");
Writer w(res);
return res;
}
int main() {
std::cout<<make_string_ok()<<std::endl;
}
То, что я наивно ожидаю, когда make_string_ok вызывается:
-
resконструктор дляres(значениеresравно"A") - Конструктор для
wназывается - выполняется
return res. Текущее значение res должно быть возвращено (путем копирования текущего значенияres), то есть"A". - Вызывается деструктор для
w, значениеresстановится"AB". - Вызывается деструктор для
res.
Поэтому я ожидал бы "A" в результате, но получим "AB" напечатанный на консоли.
С другой стороны, для немного другой версии make_string:
std::string make_string_fail(){
std::pair<std::string, int> res{"A",0};
Writer w(res.first);
return res.first;
}
результат будет таким, как ожидалось, - "A" (см. live).
Указывает ли стандарт, какое значение должно быть возвращено в приведенных выше примерах или оно не указано?