-
boost::asio 완료 핸들러에 제네릭 람다 사용 시 있었던 문제프로그래밍/c++ - boost::asio 2015. 9. 17. 17:34반응형
컴파일 타임에 오류가 나는데 잡기가 꽤 어려웠다. 문제의 코드를 보자.
123456789101112131415161718192021tcp_socket.async_receive(buffer_write_section,receive_complete_handler);[this](const auto& error, size_t bytes_transferred){if (error){this->on_error(error);return;}this->receive_buffer.commit(bytes_transferred);// 버퍼의 읽기 부분을 추출.auto read_section = this->receive_buffer.data();auto read_data = asio::buffer_cast<const char*>(read_section);auto read_size = asio::buffer_size(read_section);this->on_receive();} // lambda); // async_receivecs 위 코드는 문제가 없게 보였다. 하지만 컴파일 오류가 발생했고 람다 안 코드에 주석을 하나씩 달아보며 뭐가 문제인지를 찾아봤다.
...
//버퍼의 읽기 부분을 추출
부분에 있는 코드를 지우니 문제 없이 빌드가 되더라. 어 그러면 저 buffer_cast 부분을 잘못 사용한 건가? 래퍼런스에는 저렇게 사용하는 게 맞던데? 라고 생각해서 다른 부분을 고쳐봤다.
123456789101112131415161718192021tcp_socket.async_receive(buffer_write_section,receive_complete_handler);// ** auto가 아닌 명시적 람다로 바꾸었다![this](const boost::system::error_code& error, size_t bytes_transferred){if (error){this->on_error(error);return;}this->receive_buffer.commit(bytes_transferred);// 버퍼의 읽기 부분을 추출.auto read_section = this->receive_buffer.data();auto read_data = asio::buffer_cast<const char*>(read_section);auto read_size = asio::buffer_size(read_section);this->on_receive();} // lambda); // async_receivecs 이렇게 바꾸니까 빌드가 되네? 그럼 buffer_cast가 잘못된 게 아니었구나..
근데 vs2015는 제네릭 람다를 지원하는데?...
해서..
12345678910111213141516171819202122tcp_socket.async_receive(buffer_write_section,receive_complete_handler);[this](const auto& error, size_t bytes_transferred)->void // ** 반환형을 명시적으로 지정했다.{if (error){this->on_error(error);return;}this->receive_buffer.commit(bytes_transferred);// 버퍼의 읽기 부분을 추출.auto read_section = this->receive_buffer.data();auto read_data = asio::buffer_cast<const char*>(read_section);auto read_size = asio::buffer_size(read_section);this->on_receive();} // lambda); // async_receive음.. 이렇게 하니까 빌드가 되더라.
아마 저 return; 부분 때문에 컴파일러가 반환형을 잘못 추측해서 발생한 게 아닐까 싶다.
그 증거로 위 코드에서 반환형 부분을 void가 아닌 auto로 지정하면 오류가 발생한다.
* vs만의 문제일지는 모르겠다. 하지만 이런 경우도 있을 수 있다는 걸 알았다.
반응형'프로그래밍 > c++ - boost::asio' 카테고리의 다른 글
asio::strand의 올바른 사용법 (0) 2015.12.02 boost::asio의 송신 함수. async_write, async_write_some, async_send의 차이 (0) 2015.11.10 boost::asio::streambuf에 custom memory allocator 붙이기 (0) 2015.11.07 boost::asio deadline_timer를 이용한 유니티의 Invoke함수 흉내 내기 (0) 2015.09.28 boost::asio::streambuf 분석.. (0) 2015.09.15