我想改造这个工作代码:
ofstream outfile("my_file.txt");
copy(v.begin(), v.end(), ostream_iterator<int>(outfile));
进入这个:
copy(v.begin(), v.end(), ostream_iterator<int>(ofstream("my_file.txt")));
换句话说,我使用了 ofstream 对象的“匿名”或未命名版本。
两个问题:
(1)为什么第二次尝试失败?
(2) 第二次尝试在风格上是否更好,还是在 C++ 中更好地保留所有内容的显式命名?我来自 Python 背景,其中对象始终是动态创建的。
谢谢!!
最佳答案
ostream_iterator<T>
构造函数采用非 const
对流对象的引用,而临时对象最多可以作为 const
传递引用(至少在 C++03 中); this question 中对此的基本原理进行了很好的解释。 .
顺便说一句,这里关于如何传递流没有太多选择:a const
引用没有意义(ostream_iterator
有 修改流),和一个普通的 ostream
是 Not Acceptable ,因为它是不可复制的(切片会杀死多态性)。
在 Python 中,您可以即时构建/传递内容,因为您总是处理引用到引用计数(和垃圾收集)对象。
C++ 对象语义完全不同——一个对象是一个对象,而不是一个引用;要获得类似于 Python 的语义,您必须使用 new
动态分配每个对象。把它们包裹在shared_ptr<T>
中传递.
is it better in C++ to keep everything explicitly named
不一定 - 创建临时对象是完全正常的,但您必须知道您可以用它们做什么和不能做什么,引用如何影响它们的生命周期等。
关于临时 ostream 对象的 C++ 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15126096/