临时ostream对象的c ++问题

Jas*_*son 5 c++ anonymous-objects temporary-objects

我想改变这个工作代码:

ofstream outfile("my_file.txt");
copy(v.begin(), v.end(), ostream_iterator<int>(outfile));
Run Code Online (Sandbox Code Playgroud)

进入这个:

copy(v.begin(), v.end(), ostream_iterator<int>(ofstream("my_file.txt")));
Run Code Online (Sandbox Code Playgroud)

换句话说,我使用ofstream对象的"匿名"或未命名版本.

两个问题:

(1)为什么第二次尝试失败?

(2)第二次尝试在风格上是否很好,或者在C++中保持所有明确命名的更好?我来自Python背景,其中对象是一直在创建的.

谢谢!!

Mat*_*lia 3

构造ostream_iterator<T>函数采用对流对象的非const 引用,而临时对象最多可以作为const引用传递(至少在 C++03 中);这个问题的基本原理得到了很好的解释。

顺便说一句,这里关于如何传递流没有太多选择:引用const没有意义(ostream_iterator 必须修改流),并且普通ostream是不可接受的,因为它是不可复制的(切片会杀死多态性)。

在Python中,你可以摆脱动态构造/传递东西的麻烦,因为你总是处理对引用计数(和垃圾收集)对象的引用

C++ 对象语义完全不同——对象对象,而不是引用;要获得类似于 Python 的语义,您必须动态分配每个对象new并将它们包装在shared_ptr<T>.

在 C++ 中,让所有内容都显式命名是否更好?

不一定 - 创建临时对象是完全正常的,但您必须了解可以使用它们做什么和不能做什么,引用如何影响它们的生命周期等。

  • 在 C++03 中也是如此。在 C++11 中,您可以将临时变量作为非常量*右值引用*传递。 (2认同)