Это похоже на глупый вопрос, но это точный момент, когда 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).
Указывает ли стандарт, какое значение должно быть возвращено в приведенных выше примерах или оно не указано?