c++ - 成员(member)调用接线员<<

标签 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 为什么编译器在生成运算符之前首先运行函数。

我是如何遇到这个问题的: 我有一个容器类,可以将数据保存在字节数组中。 不知何故 'container.WriteConvert(..);'在名为“a”的整数之前插入字节数组。有没有人对此有解释。

我可以使 WriteConvert 静态或添加一个额外的行这将解决这个问题,而不是返回一个 Container& 但我有点感兴趣编译器按此顺序放置它的原因是什么。 p>

    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 static 或在 Container 类之外的原因是有一些原因的。我也有 ReadConvert,我不想有多行。如果有人有其他想法,我愿意接受其他解决方案,而不会增加行数。

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

最佳答案

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

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

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

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

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

关于c++ - 成员(member)调用接线员<<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57939628/

相关文章:

c++ - 未定义引用 boost::program_options::abstract_variables_map::operator[]

c++ - vector< vector<Point3f>> 中的最高值

c++ - 为什么重载运算符不将主要对象设置为值集

c++ - MSVS 12,C++,命令参数不起作用

c# - 将 C# 转换为非托管 C++

c++ - 一个参数中有 2 个常量

C++ WinHTTP API 读取数据

c++ - QT 将文本翻译成特定的语言环境

c++ - 在 C++ 中声明本地对象

c++ - 多线程调试器