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, {}));