破坏本地自动功能变量与构造返回值之间的顺序

时间:2019-05-06 03:40:40

标签: c++ c++11 c++14 language-lawyer c++17

存在依赖于以下事实的代码:创建返回值后,本地自动函数变量将被破坏,例如:

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;
    }
};

标准在哪里指定可以保证此顺序?

2 个答案:

答案 0 :(得分:8)

[stmt.return]/3

  

调用结果的复制初始化在排序之前   正式表达结束时临时人员的销毁   由return语句的操作数确定,而该语句又是   在销毁的局部变量([stmt.jump])之前排序   包含return语句的块。

答案 1 :(得分:2)

您标记了多种语言版本。因此,我注意到@songyuanyao带来的报价并不总是存在。它在DR 1885下进行了修改,其中详细说明了return语句的指定不足。具体来说,C ++ 14中缺少与排序相关的措辞,而在DR下的C ++ 17中对此进行了修改。

实际上,您的代码也可能在C ++ 14中也是正确的。供应商的QoI标准很高。