这似乎是一个愚蠢的问题,但是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
is"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)。
标准是否规定了上面示例中应返回的值,或者未指定?