是否在lock_guard析构函数之前或之后执行了复制返回操作?

Vik*_*ehr 9 c++ destructor thread-safety race-condition stdmutex

get_a()功能安全的比赛条件或者我需要明确地复制str_get_b()为了有一个线程安全的功能?

class Class {
public:
  auto get_a() -> std::string {
    auto&& guard = std::lock_guard{mutex_};
    return str_;
  }
  auto get_b() -> std::string {
    auto&& guard = std::lock_guard{mutex_};
    auto str = str_;
    return str;
  }
private:
  std::mutex mutex_{};
  std::string str_{};
};
Run Code Online (Sandbox Code Playgroud)

注意:我知道Stack Overflow上有类似的问题,但我找不到明确回答这个问题的问题.

Rak*_*111 11

[stmt.return] p3:

调用结果的复制初始化在return语句的操作数建立的全表达式结束时临时销毁之前被排序,而该语句的操作数又在块的局部变量被破坏之前被排序.该return声明.

这意味着以下顺序发生:

  1. 返回对象是复制初始化的
  2. return语句中的任何临时值都会被销毁
  3. 局部变量被破坏

所以,我们可以推断这get_a是完全安全的.