为什么我可以使用 rdbuf() 从 const istream 构造一个istreambuf_iterator?

Why can I construct a istreambuf_iterator from a const istream using rdbuf()?

提问人:Artikash-Reinstate Monica 提问时间:2/17/2020 最后编辑:Artikash-Reinstate Monica 更新时间:2/18/2020 访问量:192

问:

出于某种原因,这是不允许的:

void foo(const std::istream& bar) { std::istreambuf_iterator<char> baz(bar); }

但这是允许的:

void foo(const std::istream& bar) { std::istreambuf_iterator<char> baz(bar.rdbuf()); }
void foo(std::istream&& bar) { std::istreambuf_iterator<char> baz(bar); }

似乎是一个奇怪的设计选择。它所做的只是操纵 ,其访问是 ,但你只能从非 .根据什么算作“突变”,不应该是非-或采取?istreambuf_iteratorrdbuf()constistreambuf_iteratorconstistreamistreamrdbuf()constistreambuf_iteratorconst istream

C++ 常量 IOSTREAM

评论

0赞 w08r 2/17/2020
我不确定这个问题是否与证据相符。你表明你不能用常量引用来构造,而不是相反。这是正确的,因为 没有为迭代器提供在实例上运行所需的成员函数。istreamistreamconstconst
0赞 anatolyg 2/17/2020
标题不正确;我编辑了它。
5赞 anatolyg 2/17/2020
也许问为什么返回对对象的一部分的非引用会更清楚。或者类似的东西。rdbufconstconst
0赞 w08r 2/17/2020
我认为@anatolyg也是在暗示,但你不应该按照你的要求去做,对吧?迭代器改变基础状态,如下所示
0赞 Artikash-Reinstate Monica 2/17/2020
是的,问题可能应该是相反的。

答: 暂无答案