取消引用的输入迭代器的地址?istream_iterator的情况

Address of a dereferenced InputIterator? The case of istream_iterator

本文关键字:istream iterator 情况 地址 引用 输入 迭代器 取消      更新时间:2023-10-16

我有一个遗留代码,其中为指针定义了接口。我正在尝试调整一些函数来接受迭代器,例如前向迭代器。

是否允许获取由输入迭代器取消引用的元素的地址,例如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);
}

采用左值的地址始终是合法的。

由于 istream_iterator::operator* 返回引用,因此它必须返回对对象的引用,该对象在函数调用之后仍然存在,直到迭代器前进。因此,您的代码是明确定义的。