vector<int> arr(1 << 20);
int p;
cin >> p >> arr[p];
这给我带来了一个分段错误,当我使用判断程序编译时(我无法访问他们的机器)编译器g ++ 4.9.2但不在我的本地Apple LLVM version 6.0 (clang-600.0.57)
然而写作:
int p;
cin >> p;
cin >> arr[p];
也适用于判断。这是一个已知的东西/错误吗?为什么第一个版本没有按预期工作?
答案 0 :(得分:16)
由于运算符重载,您的第一个代码相当于:
operator >> (operator >> (std::cin, p), arr[p]);
函数参数operator >> (std::cin, p)
和arr[p]
的评估未被排序。当您尝试以无序顺序读取和编写p
时,会出现未定义的行为。
可能发生的事情是你的实现,在这个特定的实例上,从左到右评估参数,但是法官的评估从右到左,并且索引arr
未初始化的p
。