是 get_a() 功能对竞争条件是安全的还是需要显式复制 str_ 如 get_b() 为了实现线程安全功能?
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_{}; };
注意:我知道这里有关于堆栈溢出的类似问题,但我找不到一个明确回答这个问题的问题。
[stmt.return]p3
调用结果的复制初始化在由调用的操作数建立的完整表达式结束时销毁临时变量之前排序 return 语句,然后在销毁包含 返回 陈述
return
返回
这意味着以下情况按顺序发生:
因此,我们可以推断 get_a 它是完全安全的。
get_a