gpt4 book ai didi

C++11 std::thread std::move 提示尝试使用已删除的函数

转载 作者:行者123 更新时间:2023-11-30 03:35:34 26 4
gpt4 key购买 nike

我正在学习 C++11 线程并尝试编写一个更改共享内存的线程。我分别使用了 std::refstd::move 。我使用以下代码运行代码:g++ eg3.cpp -std=c++11 -pthread。但是我发现 std::move 在我的 mac 上不工作。我得到这样的错误:

In file included from eg3.cpp:1: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/thread:337:5: error: 
attempt to use a deleted function
__invoke(_VSTD::move(_VSTD::get<0>(__t)), _VSTD::move(_VSTD::get<_Indices>(__t))...);
^
...

我的代码如下:

#include<thread>
#include<iostream>
#include<mutex>
#include<condition_variable>
#include<string>
#include<functional>
#include<utility>
using namespace std;
int main(){
string s = "Hello!";
cout << "Main before: " << s << endl;
// thread t([](string& s){cout << s << endl; s = "Ni hao!";}, ref(s)); //// This works!
// thread t([](string& s){cout << s << endl; s = "Ni hao!";}, move(s)); //// This does not work
t.join();
cout << "Main after: " << s << endl;
return 0;
}

最佳答案

你只需要让 lambda 接受 string(按值)或 string const &(按常量引用)或 string &&(右值引用)来支持移动。在这种情况下,因为你正在修改s,你不能使用string const &

thread t([](string && s){cout << s << endl; s = "Ni hao!";}, move(s));

失败是因为您无法将右值引用 (string &&) 传递给采用左值引用 (string &) 的函数/lambda。

一个简化的例子是

void test(std::string &) {}
void test2(std::string &&) {}
void test3(std::string const&) {}
void test4(std::string) {}

int main(){
std::string s;
test(std::move(s)); // fail
test2(std::move(s)); // ok
test3(std::move(s)); // ok
test4(std::move(s)); // ok
}

关于C++11 std::thread std::move 提示尝试使用已删除的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41214392/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com