簡體   English   中英

C ++跳過代碼行?

[英]C++ skipping line of code?

背景

我正在用C ++編寫一個多線程的websocket服務器。

問題

當我嘗試集成我的HTTP解析器時, MKFAHTTPRequest Request( std::string( Buffer ) ); 在執行期間完全跳過。

我已經清理了項目並添加了-Wall和-Werror(它應該告訴我Request是一個未使用的變量,但它沒有)。

void operator()(){
    while( true ){
        if( m_Socket->is_open() ){
            char Buffer[1024]; 

            boost::system::error_code Error; 

            std::cout << "MKFAConnection::operator()() - Reading..." << std::endl;
            m_Socket->read_some( boost::asio::buffer( Buffer, sizeof( Buffer ) ), Error ); 

            if( !Error ){
                // This line is getting skipped!?!?!?
                MKFAHttpRequest Request( std::string( Buffer ) );

                m_Socket->write_some( boost::asio::buffer( std::string( "Hello World" ) ) ); 

            } else break; 

        } else break; 

    }

}
 MKFAHttpRequest Request( std::string( Buffer ) ); 

這條線不符合你的想法。 您認為它定義了一個名為Request of MKFAHttpRequest的對象,並使用std::string類型的臨時對象初始化該對象。

實際上,它聲明了一個名為Request的函數,該函數接受std::string類型的單個參數,並返回MKFAHttpRequest類型的對象。

這與最令人煩惱的解析(或可能是一個例子)有關。

也許其中一個會讓它變得更好:

MKFAHttpRequest Request( (std::string( Buffer )) );
MKFAHttpRequest Request{ std::string( Buffer ) };
MKFAHttpRequest Request = std::string( Buffer );
MKFAHttpRequest Request = MKFAHttpRequest(std::string( Buffer ));

參考: http//en.wikipedia.org/wiki/Most_vexing_parse

這個:

MKFAHttpRequest Request( std::string( Buffer ) );

作為C ++中的函數聲明。 試試這個

std::string s( Buffer );
MKFAHttpRequest Request( s );

代替。

就個人而言,我認為最好的解決方案是C ++ 11的統一初始化語法:

MKFAHttpRequest Request{ std::string( Buffer ) };

但是,另一種方法是使用static_cast:

MKFAHttpRequest Request( static_cast<std::string>( Buffer ) };

static_cast將找到一個匹配的構造函數調用std :: string,取char *。 它還清楚地表明,您實際上是從char *“轉換”為std :: string以調用MKFAHttpRequest構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM