Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将std::string移动到捕获中_C++_C++11_C++14 - Fatal编程技术网

C++ 将std::string移动到捕获中

C++ 将std::string移动到捕获中,c++,c++11,c++14,C++,C++11,C++14,考虑以下示例,该示例接受msg并异步发布它 void sendMessage(std::string msg) { runAsync<void>([msg = std::move(msg)] { onPostMessage(cookie, msg.c_str()); }); }; 呼叫站点的最佳选项是什么 auto msg = ... postMessage(msg); 或 请注意,呼叫后不再

考虑以下示例,该示例接受
msg
并异步发布它

    void sendMessage(std::string msg) {
        runAsync<void>([msg = std::move(msg)] {
            onPostMessage(cookie, msg.c_str());
        });
    };
呼叫站点的最佳选项是什么

    auto msg = ...
    postMessage(msg);

请注意,呼叫后不再需要
msg


调用后,编译器是否会自动检测到我不再使用
msg
并“移动”它?

我将使用以下解决方案:

void sendMessage(std::string&& msg) {
    runAsync<void>([msg = std::move(msg)] {
        onPostMessage(cookie, msg.c_str());
    });
};

编辑:啊,你只用C++14做了标记,没关系。。。原始评论:我认为
std::string\u视图
比引用
std::string
的r值要好。但在其他方面,我认为它们的速度应该是相等的(只有按照C++17规则实际使用时,字符串才会具体化)。但是,原始版本更好,因为它同时适用于l值和r值(更易于使用)。复制省略也可能发生。关键是在调用站点,发布后不需要
msg
,因此,我试图找到一种最有效的方法来传递它,最终将其移动到捕获中……如果您仅限于C++14,它将因编译器而异,因为没有保证的复制省略或移动省略。尽管如此,我还是要说使用value和std::move更好。或者,您可以尝试生成
msg
常量,这也可能导致一些优化。但是标准在C++17之前没有任何保证……让它
const std::string msg
如何影响最终进入捕获状态?@user3612643回答:是的,第二,否。为什么交换而不移动?@user3612643 std::move消息生效后,处于未指定状态。所以,为了避免在sendMessage之后意外使用变量,我更喜欢std::exchange。见第(8)页
    auto msg = ...
    postMessage(std::move(msg));
void sendMessage(std::string&& msg) {
    runAsync<void>([msg = std::move(msg)] {
        onPostMessage(cookie, msg.c_str());
    });
};
auto msg = ...
sendMessage(std::exchange(msg, {}));