【问题标题】:Why does assigning to a reference to std::ostream fail to compile?为什么分配给 std::ostream 的引用无法编译?
【发布时间】:2011-08-02 09:23:27
【问题描述】:

我正在使用一个抽象类 std::ostream。有以下参考:

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

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

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

如何正确编写代码?

【问题讨论】:

  • 这个问题更多是关于重新安装引用而不是 std::ostream,我建议更改标题。因为这个问题很好。
  • 你需要理解 C++ 中的引用只是一个别名。因此,一旦引用被初始化,任何进一步的 operator= 都意味着只需更改引用所指的原始项目。一个很好的例子可以在下面史蒂夫的回答中找到。

标签: c++ ostream


【解决方案1】:

要么:

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

或者如果你的两个 sn-ps 之间有代码:

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

问题不是具体与抽象类有关,而是无法重新定位引用。

表达式o = file的意思不是“使o引用file”,而是“将file的值复制到o的引用中”。幸运的是,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
}

【讨论】:

【解决方案2】:

您无法重新设置参考。

这是一个替代方案:

std::ostream &o = (!condition) ? file : std::cout;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 2014-01-13
    相关资源
    最近更新 更多