在函数中传递ifstream迭代器

时间:2018-07-08 18:10:02

标签: c++ iterator default-constructor

为什么此代码有效? e迭代器未分配任何内容。如何暗示该功能持续到fstream结束?

#include <vector>
#include <iostream>
#include <list>
#include <fstream>
#include <string>
#include <iterator>

using namespace std;

template<typename InputIterator>
void printRange(InputIterator first, InputIterator last)
{
    while (first != last)
    {
        std::cout << *first << endl;
        ++first;
    }
}
int main()
{
    vector<int> v = { 11, 24, 541 };
    printRange(v.begin(), v.end());
    cout << endl;
    list<double> lst = { 11.88, 21.4, 541.9 };
    printRange(lst.begin(), lst.end());
    cout << endl;
    ifstream ifs{ "strings.txt" };
    istream_iterator<string> i(ifs);
    istream_iterator<string> e;
    printRange(i, e);
}

strings.txt

coding c++

1 个答案:

答案 0 :(得分:3)

变量e是默认构造的,因此将调用0参数的构造函数。然后从the documentation

  

constexpr istream_iterator();

     

构造流结束迭代器。这个构造函数是   如果std::is_trivially_default_constructible_v<T>为true,则为constexpr。

因此,默认构造istream_iterator会构造流结束迭代器,这正是您需要的值。