这似乎是一个愚蠢的问题,但在函数中执行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
的值为"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"
(查看实时演示)。
标准是否规定了上述示例应返回哪个值,还是未指定?
return
何时发生,直到 C++14 为止,return
的措辞并未说明本地临时变量的寿命足够长以用于构造返回值。 - Davis Herring