取消引用的 InputIterator 的地址? istream_iterator个案
Address of a dereferenced InputIterator? The case of 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);
}
取左值的地址总是合法的。
由于 istream_iterator::operator*
returns 一个引用,它必须返回一个对象的引用,该对象在函数调用之后仍然存在,直到迭代器被推进。所以你的代码是 well-defined.
我有一个遗留代码,其中接口是为指针定义的。 我正在尝试调整一些函数以采用迭代器,例如前向迭代器。
是否允许获取 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);
}
取左值的地址总是合法的。
由于 istream_iterator::operator*
returns 一个引用,它必须返回一个对象的引用,该对象在函数调用之后仍然存在,直到迭代器被推进。所以你的代码是 well-defined.