考虑此代码:
const std::size_t rawBufferSize = 1024;
char rawBuffer[rawBufferSize] = { 0 };
boost::asio::ssl::stream< boost::asio::ip::tcp::socket >* sslStream;
... // initializing stuff
boost::system::error_code ec;
auto buffer = boost::asio::buffer(rawBuffer, rawBufferSize);
for(; ; )
{
int readBytes = sslStream->read_some(buffer, ec); // I know that read_some return std::size_t (unsigned int)...
// here, readBytes equals -1
if (ec)
break;
... (1)
}
“readBytes”如何等于-1并且达到“(1)”行。
我在做错什么的任何线索?
答案 0 :(得分:1)
在您的情况下,您的error_code
变量不是指针,因此以下if语句
if (ec)
break;
如果error_code确实存在,则无法正确检查。
您需要执行此操作以检查是否存在error_code:
if (ec.value() != 0) break;
现在,当发生错误时,它将break
正确。
error_code的值可以是enum
内的任何these错误条件。
答案 1 :(得分:1)
在error_code.hpp
中,您可以找到以下定义:
class error_code
{
...
typedef void (*unspecified_bool_type)();
static void unspecified_bool_true() {}
operator unspecified_bool_type() const // true if error
{
return m_val == 0 ? 0 : unspecified_bool_true;
}
bool operator!() const // true if no error
{
return m_val == 0;
}
...
}
如果你使用这样的东西:
if (!ec) {
// no error
}
你得到了正确的行为,我希望它很清楚。当你这样称呼时:
if (ec) {
// error
}
你实际上调用operator unspecified_bool_type()
,因为它返回一个指针(到函数)并且可以转换为bool。如果有错误,则返回指向unspecified_bool_true
的指针,该指针不为空。因此它可以正常工作,并不能解决问题。