临时 ostream 对象的 C++ 问题

标签 c++ temporary-objects anonymous-objects

我想改造这个工作代码:

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/

相关文章:

c++带有嵌套多态模板的动态转换

c++ - 初始化列表和 const& - 这是合法的 C++

c++ - VS2010 : Temporaries can't be bound to non-const references

java - 如何访问 Java 中的 TreeSelectionListener 父类(super class)?

java - 将对象传递给数组的不同类型

c# - 创建后将属性添加到匿名类型

c++ - 如何正确找出lambda的返回类型

c++ - 如何将 libcurl 与 dev c++ 静态链接?

c++ - 创建具有基于字符串的类型的多态 C++ 对象的最佳方法?

c++ - 我可以在 C++ 中移动临时对象的属性吗?