存在依赖于以下事实的代码:创建返回值后,本地自动函数变量将被破坏,例如:
1)Unmangling the result of std::type_info::name
std::string demangle(const char* name)
{
int status = -4;
std::unique_ptr<char, void(*)(void*)> res {
abi::__cxa_demangle(name, NULL, NULL, &status),
std::free
};
return (status==0) ? res.get() : name;
}
2)Timing of scope-based lock guards and return values
class C {
mutable std::mutex _lock;
map<string,string> deep_member;
public:
auto get_big_lump()
{
std::unique_lock<std::mutex> lock(_lock);
return deep_member;
}
};
标准在哪里指定可以保证此顺序?
答案 0 :(得分:8)
调用结果的复制初始化在排序之前 正式表达结束时临时人员的销毁 由return语句的操作数确定,而该语句又是 在销毁的局部变量([stmt.jump])之前排序 包含return语句的块。
答案 1 :(得分:2)
您标记了多种语言版本。因此,我注意到@songyuanyao带来的报价并不总是存在。它在DR 1885下进行了修改,其中详细说明了return语句的指定不足。具体来说,C ++ 14中缺少与排序相关的措辞,而在DR下的C ++ 17中对此进行了修改。
实际上,您的代码也可能在C ++ 14中也是正确的。供应商的QoI标准很高。