取消引用的输入迭代器的地址?istream_iterator的情况
Address of a dereferenced InputIterator? The case of istream_iterator
我有一个遗留代码,其中为指针定义了接口。我正在尝试调整一些函数来接受迭代器,例如前向迭代器。
是否允许获取由输入迭代器取消引用的元素的地址,例如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*
返回引用,因此它必须返回对对象的引用,该对象在函数调用之后仍然存在,直到迭代器前进。因此,您的代码是明确定义的。
相关文章:
- 为什么istream不支持右值提取
- 将无符号char*转换为std::istream*C++
- 需要从 istream 和 ostream 派生 iostream
- 使用std::istream::peek()总是安全的吗
- 使用 istream 参数读取的 istream 函数
- istream std::cin如何修改自定义istream缓冲区
- 在调试模式下引发C++ "deque iterator not dereferencable"异常
- std::iterator::reference 必须是引用吗?
- 为什么我在使用 istream 迭代器时会出现 seg 错误?
- 在清除 istream 之前,我不应该需要取消获取它吗?
- C++,如何根据运行时条件构造引用不同 istream 对象的对象?
- 如何将QByteArray转换为std::istream或std::ifstream?
- 逗号在重载 ostream 和 istream 在结构中分开
- 为什么unordered_set<string::iterator>不起作用?
- 为什么 Clang std::ostream 写一个 std::istream 无法读取的双精度?
- 从函数返回 istream 的正确方法
- 阅读从 istream 到矢量的不同类型列表
- 造成致命错误:boost/fusion/iterator/equal_to.hpp 没有这样的文件或目录
- 关于 istream 中的错误处理的问题
- Visual accept std::string from std::byte iterator