【问题标题】:How to properly cast boost::asio::buffers_iterator as InputIterator如何正确地将 boost::asio::buffers_iterator 转换为 InputIterator
【发布时间】:2019-11-18 12:37:52
【问题描述】:

我在 std::string 构造函数中使用 boost::asio::buffers_iterator:

std::unique_ptr<boost::asio::streambuf> receiveBuf;
size_t length = <>; // calculate length
...
std::string message(boost::asio::buffers_begin(receiveBuf->data()),
    boost::asio::buffers_begin(receiveBuf->data()) + length);

代码工作正常,但覆盖率抱怨:

(1) Event no_matching_constructor:  no instance of constructor "std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string [with _CharT=char, _Traits=std::char_traits<char>, _Alloc=std::allocator<char>]" matches the argument list
(2) Event caretline:    ^
(3) Event argument_list_types_add_on:   argument types are: (boost::asio::buffers_iterator<boost::asio::const_buffers_1, char>, <error-type>)

那么,我想知道,如何正确地转换 boost 的迭代器?

更新 在@Caleth 指出+ 长度 之后,结果却不是那么明显。我必须承认我过度简化了我的示例代码(以便专注于最相关的部分),因此以错误的方式制作它。很抱歉造成混淆,但对于上面显示的示例,coverage 是无声的。当拼图中还有一块时,它会抱怨:

std::unique_ptr<boost::asio::streambuf> receiveBuf;
size_t length = <>; // calculate length
size_t delimSize = <>; // delimiter size

...
std::string message(boost::asio::buffers_begin(receiveBuf->data()),
    boost::asio::buffers_begin(receiveBuf->data()) + length - delimSize);

所以,它看起来迭代器可以高级(运算符+重载?)但不能减去(好吧,代码编译和工作,但至少覆盖性不好)......

【问题讨论】:

    标签: c++ boost coverity


    【解决方案1】:

    错误来自无效的表达式boost::asio::buffers_begin(receiveBuf-&gt;data()) + length

    如果length 表示“缓冲区中的所有数据”,您需要boost::asio::buffers_end(receiveBuf-&gt;data())

    std::string message(boost::asio::buffers_begin(receiveBuf->data()),
        boost::asio::buffers_end(receiveBuf->data()));
    

    否则,您将需要使用std::copy_n 之类的内容填写message

    std::string message(length);
    std::copy_n(boost::asio::buffers_begin(receiveBuf->data()), length, message.begin());
    

    拥有+RandomAccessIterator 的一个特性,这是一个比InputIterator 更严格的约束

    【讨论】:

    • 谢谢,我同意 buffers_begin/end 的正确性,但是看看我的更新,看起来推进是合法的......
    猜你喜欢
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2021-11-21
    • 2018-01-04
    相关资源
    最近更新 更多