c++ - 为什么分配给对 std::ostream 的引用无法编译?

标签 c++ ostream

我正在使用抽象类 std::ostream。有如下引用:

std::ostream &o = std::cout; 

如果满足任何条件,我需要初始化 o 以便将输出重定向到 std::cout。如果不是,输出将被重定向到文件

if (!condition)
    o = file; //Not possible 

如何正确编写代码?

最佳答案

或者:

std::ostream &o = condition ? std::cout : file;

或者如果您的两个代码段之间有代码:

std::ostream *op = &std::cout;
// more code here
if (!condition) {
    op = &file;
}
std::ostream &o = *op;

这个问题不是特别与抽象类有关,而是无法重新设置引用。

表达式o = file的意思不是“让o引用file”,而是“复制fileo 的 referand”。幸运的是,std::ostream 没有 operator=,因此它无法编译并且 std::cout 没有被修改。但是考虑一下不同类型会发生什么:

#include <iostream>

int global_i = 0;

int main() {
    int &o = global_i;
    int file = 1;
    o = file;
    std::cout << global_i << "\n"; // prints 1, global_i has changed
    file = 2;
    std::cout << o << "\n"; // prints 1, o still refers to global_i, not file
}

关于c++ - 为什么分配给对 std::ostream 的引用无法编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6909838/

相关文章:

c++ - 用于同时创建和播放音频的 Python 音频库

c++ - 如何将我们自己的函数声明放入 C++ 的 iostream 库中?

common-lisp - “~&” 知道Ostream是否在线头?

c++ - 显示对 std::ostream 的输入

c++ - ostream 重载 for 循环,没有返回值

c++ - 打开CV : unresolved external symbol

c++ - 使用缓存内存。映射技术

c++ - 出于某种原因,OutputStream 打印 '1'

c++ - 使用初始化列表重载默认构造

c++ - 将枚举转换为 int