成员呼叫操作员<<

时间:2019-09-14 22:08:22

标签: c++

这是我的问题:

int addsomeStuff(std::ostream &cout, int b) {
    cout << b;
    return 2;
}

int main() {
    int a = 1;
    cout << a << addsomeStuff(cout, 3) << endl;
    return 0;
}

Output: 312

有人可以向我解释输出结果吗,我希望输出结果更像132 为什么编译器在生成运算符之前先运行Function。

我如何遇到此问题: 我有一个容器类,可以在一个字节数组中保存数据。 以某种方式“ container.WriteConvert(..);”被插入到名为“ a”的整数之前的字节数组中。有人对此有解释吗?

我可以将WriteConvert设置为静态,或者添加一条额外的可以解决此问题的行,而不是返回Container&,但是我很想知道编译器将其按此顺序放置的原因。

    int a = 2;
    Container container;
    container << a << container.WriteConvert("TestString");

    int b = 0;
    container >> b;
    cout << b;

    // The ouput of 'b' is some stupid Data which is caused by WriteConvert.

我没有写此WriteConvert静态或在Container类之外的原因有某些原因。我也有ReadConvert,我不想有多行。如果有人有其他想法,我愿意接受其他解决方案,而不会增加行数。

    int b = 0;
    string output
    container >> b >> container.ReadConvert(output);
    cout << b;

1 个答案:

答案 0 :(得分:0)

C++17之前,链接的运算符参数的求值的顺序是未指定。这意味着执行程序可能首先评估了addsomeStuff(cout, 3)调用(因此首先打印3),然后继续打印a和返回值addsomeStuff(cout, 3)

使用C++17,可以明确定义评估的顺序-从左到右。这意味着,如果编译器正确实现了C++17标准,则唯一可能的输出是132

如果您坚持使用C++17之前的标准,则需要首先评估所有参数,然后在链式运算符调用中使用它们,或者不要使用链式运算符调用:

int main() {
    int a = 1;
    cout << a;
    cout << addsomeStuff(cout, 3) << endl;
    return 0;
}

前一种方法可能会改变行为,但定义明确。