Lambda初始化技巧安全性和RAII

时间:2019-03-27 12:29:06

标签: c++ lambda

前一段时间,我偶然发现了一些使用立即执行的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&或副本是否有关系?

有人对此有安全提示吗?

0 个答案:

没有答案
相关问题