2016-02-25 59 views
1

我試圖通過boost::lexical_cast子串(由一對迭代的表示)轉換爲整數:意外結果與升壓:: iterator_range的

#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>濫用lexical_castlexical_castiterator_range
  2. 錯誤或iterator_range
  3. 一些其他原因

回答

1

簡短的答案是2號從你的列表中,濫用

  • iterator_range - 特別是你使用它沒有明確包括適當頭爲它。

    添加此:

    #include <boost/range/iterator_range.hpp> 
    

    將使其行爲像您期望。

    iterator_range和相關功能被分成兩個標頭,iterator_range_core.hppiterator_range_io.hpp。第一個包含類定義,第二個包含重載,這使得它可以流式傳輸,因此可用於lexical_cast(可用於實際上將按預期工作)。

    因爲你沒有包含正確的頭文件,通常應該會得到一個編譯器錯誤,但在這種情況下,你不會得到它,因爲lexical_cast.hpp包含這兩個頭文件中的第一個,iterator_range_core.hpp。這使得一切正常,但它不會從第二個標題獲得operator<<。如果沒有這種過載,當lexical_cast將範圍寫入流以執行轉換時,它發現的最佳過載是採用參數bool的參數(因爲iterator_range的默認轉換爲bool)。這就是爲什麼你看到1,因爲它實際上是true到底層的轉換流。

    你可以像這樣的東西很容易測試:

    auto someRange = boost::make_iterator_range(first, last); 
    std::cout << std::boolalpha<< someRange; 
    

    沒有#include <boost/range/iterator_range.hpp>這將打印true,與include它將打印字符串(80)。

  • +0

    優秀的分析。 – sehe

    +0

    很好的回答,謝謝! – kakkoko