gpt4 book ai didi

临时 ostream 对象的 C++ 问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:23 25 4
gpt4 key购买 nike

我想改造这个工作代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com