GCC — C ++ пропустить строку кода?

Фон

Я пишу многопоточный сервер websocket на C ++.

проблема

Когда я пытаюсь интегрировать мой парсер 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;

}

}

7

Решение

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

Эта строка не делает то, что вы думаете, что делает. Вы думаете, что это определяет объект с именем Request типа 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 ));

Ref: http://en.wikipedia.org/wiki/Most_vexing_parse

10

Другие решения

Это:

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

это как объявление функции в C ++.
Попробуй это

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

вместо.

0

Лично я считаю, что лучшим решением является единый синтаксис инициализатора 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.

0
По вопросам рекламы [email protected]