前一段时间,我偶然发现了一些使用立即执行的lambda初始化变量的代码。像这样:
std::string greeting = [] { return std::string("Hello World"); } ();
最初,我觉得这是表达简单事物并试图炫耀的一种滑稽的复杂方式。在我遇到一个经常使用的用例之前,我需要在其中初始化变量,但必须对范围进行锁定才能这样做。同时避免锁争用并保持范围小。所以我经常发现自己在做这样的事情:
std::string greeting; { scoped_lock slock(greeter.get_lock()); greeting = greeter.get_greeting(); } // Do lengthy operations with greeting with the lock // now dropped foo(greeting);
现在这有几个缺点。它很冗长,字符串不能是const。因此,我发现lambda初始化可能会很好地解决问题
const std::string greeting = [&] { scoped_lock slock(greeter.get_lock()); return greeter.get_greeting(); }
但是后来我开始想……这真的很安全吗? C ++标准是否保证在删除锁之前将返回的结果返回复制(或确实检索到)? get_greeting()返回const std :: string&或副本是否有关系?
有人对此有安全提示吗?