boost :: lexical_cast <int>与boost :: iterator_range的意外结果

时间:2016-02-25 09:26:44

标签: c++ boost

我尝试将子字符串(由一对迭代器表示)转换为整数boost::lexical_cast

#include <iostream>
#include <boost/lexical_cast.hpp>

int main()
{
    // assume [first, last) as substring
    const std::string s("80");
    auto first = s.begin(), last = s.end();

    std::cout << boost::lexical_cast<int>(boost::make_iterator_range(first, last)) << std::endl;
    return 0;
}

输出:(wandbox

1

我通过变通方法得到了预期的结果(80):boost::make_iterator_range(&*first, last - first)

问题为什么以上代码无法按预期工作?而1来自哪里?

  1. lexical_cast不支持iterator_range<std::string::(const_)iterator>
  2. 滥用lexical_castiterator_range
  3. lexical_castiterator_range
  4. 的错误
  5. 其他原因

1 个答案:

答案 0 :(得分:1)

简短回答是您的列表中的第2个,误用了iterator_range - 特别是您在没有明确包含正确标题的情况下使用它。

添加:

#include <boost/range/iterator_range.hpp>

会让它按照您的预期行事。

iterator_range及相关功能分为两个标题iterator_range_core.hppiterator_range_io.hpp。第一个包含类定义,第二个包含operator<<重载,它使得它可以流式传输,因此lexical_cast可以使用(在某种意义上它可以实际工作,因为你期望)。

由于您没有包含正确的标头,因此通常应该收到编译器错误,但在这种情况下,由于lexical_cast.hpp包含这两个标头中的第一个标头iterator_range_core.hpp,因此您无法获取它{1}}。这使得一切都很好,但它没有从第二个标题获得operator<<。如果没有那个重载,当lexical_cast将范围写入流以执行转换时,它找到的最佳重载是采用bool参数的重载(因为iterator_range具有默认转换为{ {1}})。这就是为什么您看到bool的原因,因为它实际上将1写入基础转化流。

您可以使用以下内容轻松测试:

true

如果没有auto someRange = boost::make_iterator_range(first, last); std::cout << std::boolalpha<< someRange; ,则会打印#include <boost/range/iterator_range.hpp>true会打印您的字符串(80)。