C ++输入流:Solaris与Linux中的操作顺序

时间:2015-01-14 21:37:07

标签: c++ linux stream solaris

我有一个非常简单的测试程序,它使用istringstreams从std :: string读取整数。代码是:

std::map<int, int> imap;
int idx, value;
std::string str("1 2 3 4 5 6 7 8");
istringstream is(str);
while(is >> idx >> imap[idx]){
    cout << idx << " " << imap[idx] << endl;
}
cout << endl;

std::map<int, int>::iterator itr;
for(itr = imap.begin(); itr != imap.end(); itr++){
    cout << itr->first << " " << itr->second << endl;
}

当我在Solaris 10上运行它时,它会产生以下输出:

1 2
3 4
5 6
7 8

1 2
3 4
5 6
7 8

然而,当我在CentOS 7下运行时,我得到:

1 0
3 0
5 0
7 0

1 4
3 6
5 8
7 0
4204240 2

有谁知道为什么在Linux下会比在Solaris下有所不同?在读入地图索引之前,显然已将值读入地图,但我不知道为什么。我可以通过稍微更改代码使其在Linux下运行:

std::map<int, int> imap;
int idx, value;
std::string str("1 2 3 4 5 6 7 8");
istringstream is(str);
while(is >> idx >> value){
    imap[idx] = value;
    cout << idx << " " << imap[idx] << endl;
}

std::map<int, int>::iterator itr;
for(itr = imap.begin(); itr != imap.end(); itr++){
    cout << itr->first << " " << itr->second << endl;
}

我知道这是一个有效的解决办法,但我周围的人都想知道为什么会有所不同。我们正在从Solaris迁移到Linux,当这样的事情出现时,他们想知道原因。我不知道为什么我要求指导。

1 个答案:

答案 0 :(得分:5)

is >> idx >> imap[idx]

此表达式相当于

operator>>(operator>>(is, idx), imap.operator[](idx))

对同一函数的参数的评估相对于彼此没有排序;可以首先评估operator>>(is, idx)imap.operator[](idx)(即,可以首先评估is >> idximap[idx])。如果首先评估后者,那么结果是一个左值,它引用与地图中idx值对应的值;这个值将被第二次读取覆盖,而不是与idx new 值相对应的值。

修改后的代码通过确保在idx被访问之前读取imap[idx]来解决此问题。