在基于 CWG 1885 的 C++11 中的“unique_lock”未定义行为下返回

Ipi*_*ano 6 c++ c++11

CWG 1885的存在似乎意味着在 C++14 之前,以下代码不能保证线程安全

std::string get_string()
{
    std::unique_lock<std::mutex> lock(some_shared_mutex);
    return some_shared_string;
}
Run Code Online (Sandbox Code Playgroud)

因为函数退出时事件的顺序无法保证 - 例如,lock在要返回的临时对象从 复制初始化之前可能会被销毁some_shared_string,从而导致竞争条件。

这在实践中似乎不太可能成为问题——这是它的主要优点之一unique_lock是你应该能够做这样的事情,我会有点惊讶地发现实现并不能保证即使标准没有这样做。

所以我的问题

  • 我不熟悉 C++ 缺陷报告如何追溯应用,但似乎因为这是“CD4”状态,这意味着它追溯适用于 C++14,但不适用于 11;那是对的吗?cppreference上的缺陷报告列表似乎也说明了这一点 - 1579 适用于 C++11,但 1885 适用于 C++14
  • 这是一个实际问题吗?如果支持 C++11 的编译器不能保证预期的顺序,那么这似乎是一个错误。尽管它在技术上可以遵循标准而不这样做,但我不明白为什么有人会想要这样做。
  • 那么对于非常旧的编译器呢?如果这一个问题,并且通过特定实现追溯应用于 C++11,我如何确定哪个版本的编译器修复了它?我被仍在使用 GCC 4.8 的工具链所困扰 - 我在 GCC bugzilla 中没有看到任何关于此的错误报告,但我找不到任何确认,这也不是一个潜在的问题。