C++ 错误:传递‘;常量字符串{aka const std::basic_string<;char>;}’;as‘;这’;放弃限定符[-fppermissive]的参数

C++ 错误:传递‘;常量字符串{aka const std::basic_string<;char>;}’;as‘;这’;放弃限定符[-fppermissive]的参数,c++,websocket,stdstring,casablanca,cpprest-sdk,C++,Websocket,Stdstring,Casablanca,Cpprest Sdk,我正在尝试使用Cpprest sdk(卡萨布兰卡)实现Websocket客户端。我成功地建立了Web套接字连接,并且能够发送/接收消息。响应作为websocket_传入_消息的实例接收,该消息具有一个方法extract_string(),其定义为 _ASYNCRTIMP pplx::task<std::string> web::websockets::client::websocket_incoming_message::extract_string ( ) cons


我正在尝试使用Cpprest sdk(卡萨布兰卡)实现Websocket客户端。我成功地建立了Web套接字连接,并且能够发送/接收消息。响应作为websocket_传入_消息的实例接收,该消息具有一个方法extract_string(),其定义为

_ASYNCRTIMP pplx::task<std::string> web::websockets::client::websocket_incoming_message::extract_string (       )   const
我试过了
1.将ws_响应声明为引用
2.捕获ws_响应作为lambda中的引用
3.将ws_响应声明为cpprest json,并将响应分配为json字段(ws_响应[U(“输出”)]=json::value::string(ws_body.c_str())

没有运气

我在C++中没有太多的编码经验,并且与此相抗衡。 有人可以帮助我在lambda之外捕获这个响应,以便我可以将值返回给调用方法吗

谢谢和问候,
斯瓦提德赛

[ws\u response](websocket\u传入消息i\u msg){return i\u msg.extract\u string();}

上面的lambda根本没有理由捕获
ws\u响应
,因为它不使用
ws\u响应

[ws\u response](std::string ws\u body){ws\u response=ws\u body;}

上述lambda需要通过引用捕获
ws\u响应
,以便正确修改。按照lambda当前的编码方式,它通过值捕获
ws\u响应的副本,该副本是
const
,因为lambda未声明为
可变的。这就是为什么会出现编译器错误-您试图将
ws\u body
分配给lambda本地的
const std::string
对象,而不是分配给
ws\u response
变量,该变量在
send\u command()
中声明。上述λ大致相当于:

const std::string ws\u response\u copy=ws\u response;
ws_response_copy=ws_body;//receive()。然后([](websocket\u传入消息i\u msg){
返回i_msg.extract_string();
})。然后([&ws_响应](std::string ws_body){
ws_response=ws_body;
});
或者,
extract\u string()
返回一个
pplx::task
,它有一个
get()
方法来检索实际的
std::string
,等待它可用。因此,上述内容可简化为以下内容:

client->receive()。然后([&ws\u response](websocket\u传入消息i\u msg){
ws_response=i_msg.extract_string().get();
});

“因此它返回常量字符串”-这不是
常量在本文中的意思。这意味着
extract\u string()
本身是
const
,即可以在
const websocket\u传入消息
对象上调用它。
extract_string()
的实际返回类型是
pplx::task
(不是
std::string
),返回值上没有
const
pplx::task
有一个
get()
方法来获取实际的
std::string
。我认为错误是有一个const std::string&a分配给std::string&B,这是不允许的,因为修改B也会修改a。行已经很复杂了。没有给编译器这个位置吗?_ASYNCRTIMP pplx::task是否可以转换为非常量引用?@ErnieMur OP引用的
const
extract\u string()
声明末尾的
const
。Re:错误消息,您描述的也不是错误的意思。该错误表示正在将
const std::string
作为目标调用
操作符=
,而不是相反。此外,在分配给B之后修改B也不会修改A,这不是
std::string
的工作方式。而且
\u ASYNCRTIMP
不是返回类型的一部分,它只是一个宏,解析为
\u declspec(dllimport | dllexport)
。返回类型只是
pplx::task
您的意思是这样的,它在这里使用gcc::const std::string a生成类似的错误消息;a=someOtherString?很好的解释。我从未在C++中使用过lambda,但是我试图找出错误的地方(在我读到你的答案之前)。我找不到,因为ws_响应没有定义常量,而且我不清楚在这两者之间是否有常量副本。你做了两次修改。我想第一次使用ws_响应而不进行任何赋值不会导致任何错误?这只是第二个lambda?@ErnieMur是的,这是第二个未能编译的lambda,您的编译器应该向您指出这一点。看看什么是lambda以及它是如何工作的。谢谢你的建议。早些时候,我曾尝试通过引用捕获。编译将成功,但ws_响应中未捕获该值。我在lambda外面打印ws_响应,它一直是空的。“或者,extract_string()返回一个pplx::task,它有一个get()方法来检索实际的std::string,等待它可用。”,这引发了一个想法,我可能不会等待响应可用。添加了一个wait()方法,如下所示,client->receive()。然后([&ws_response](websocket_传入的_消息I_msg){ws_response=i_msg.extract_string().get();}).wait();现在我可以在变量中捕获响应了。感谢您的建议。
error: passing ‘const string {aka const std::basic_string<char>}’ as ‘this’ argument of ‘std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ discards qualifiers [-fpermissive]
   std::string WebSocketUtility::send_command(const char* command){

    websocket_outgoing_message o_msg;
     std::string ws_response;

    o_msg.set_utf8_message(command);
    client->send(o_msg).then([](){
        log("Message Sent!!!\n");
    });

    client->receive().then([ws_response](websocket_incoming_message i_msg){ 
           return i_msg.extract_string();
        }).then([ws_response](std::string ws_body){ 
                 ws_response = ws_body;  
        });

   log("WS_RESPONSE:%s:\n",ws_response.c_str());
    return ws_response;
  }