在本地自动函数变量被销毁和返回值构建之间的排序问题

3

存在一些代码,该代码依赖于局部自动函数变量在返回值创建后被销毁的事实,例如:

1)反编译 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) 作用域锁保护和返回值的时间安排

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个回答

8
[stmt.return]/3:
调用的结果复制初始化在return语句的操作数建立的完整表达式结束时临时对象的销毁之前进行,而该操作又在包含return语句的块的局部变量([stmt.jump])销毁之前执行。

2
你标记了多种语言的修订版。所以我要指出,@songyuanyao引用的那句话并不总是存在的。它是在DR 1885下进行修改的,该文详细说明了返回语句的规范不足之处。具体而言,C++14中缺少与顺序有关的措辞,这在DR下在C++17中得到了修改。
实际上,在C++14中,你的代码可能也是正确的。供应商有高质量标准。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接