解除引用的InputIterator的地址? istream_iterator的情况

时间:2018-03-13 22:45:56

标签: c++ dereference istream-iterator

我有一个遗留代码,其中为指针定义了接口。 我试图调整一些函数来获取迭代器,例如转发迭代器。

是否允许使用InputIterator取消引用的元素的地址,例如istream_iterator

结果是暂时的,并且必须在内存的某个地方进行通话,但我不确定。

以下示例使用double,但类型可能更复杂(大)。

#include<iostream>
#include<iterator>
#include<sstream>

void f_legacy(double const* t){
    std::cout << *t << std::endl;
};

void f(std::istream_iterator<double> it){
    f_legacy(std::addressof(*it)); // OK????
    // to avoid a copy:     auto v = *it; f_legacy(std::addressof(v));
}

int main(){
    double d = 5.;
    std::istringstream iss("1 2 3");
    std::istream_iterator<double> it(iss);
    f_legacy(&d);
    f(it);
}

1 个答案:

答案 0 :(得分:5)

取一个左值的地址总是合法的。

由于istream_iterator::operator*返回一个引用,它必须返回一个对函数调用之外的对象的引用,直到迭代器被提前。所以你的代码定义明确。