还有链接插入操作符的其他问题吗?

Kev*_*vin 2 c++

所以,我今天早些时候正在搞乱C++,尤其是链式插入运算符.我注意到一些对我来说很奇怪的事情.

#include <iostream>
using namespace std;

size_t& foo(size_t& n) {
    ++n;
    return n;
}

int main() {
    size_t bar = 5;
    cout << bar << " a " << foo(bar) << " b " << bar;
    cin >> bar;    //Ignore this, it's only here as an easy way to keep the window open
}
Run Code Online (Sandbox Code Playgroud)

运行这个,而不是5 a 6 b 6实际给出6 a 6 b 5.显然,插入操作数从右到左进行计算,然后从左到右打印,这可以解释为什么更新的值出现在函数调用之前,以及之后的原始值.

当然,这可以通过cout foo(bar)自己的线路来解决,但我离题了.

在链接插入运算符时,我是否应该注意其他任何奇怪的事情?此外,有谁知道插入操作符为什么这样做?

Ded*_*tor 5

您正在读取两次条形码并将其引用一次以进行函数调用,然后将其递增.对于读取而言,该函数调用是不确定地排序的,这些读取彼此不相关,因此允许任何排序,并且未指定它.

你没有完全未定义的行为(一切都会发生),但未指定的行为并不是更有趣.这是四个有效的输出:

5 a 6 b 5
Run Code Online (Sandbox Code Playgroud)
5 a 6 b 6
Run Code Online (Sandbox Code Playgroud)
6 a 6 b 5
Run Code Online (Sandbox Code Playgroud)
6 a 6 b 6
Run Code Online (Sandbox Code Playgroud)