使用 << >> 运算符时的歧义

Ambiguity when using << >> operators

<<>>运算符在C++中有两个含义,位移位和流操作。当上下文中的含义不明显时,编译器如何解决这种歧义?以这一行为例: std::cout << 1 << 2 << std::endl; 输出是 12,就好像第二个 << 被视为流插入,还是 4,就好像第二个 << 被视为位移?

没有歧义,因为编译器从左到右解释表达式,所以:

std::cout << 1 << 2 << std::endl; 

相当于:

((std::cout << 1) << 2) << std::endl; 

考虑 << 具有从左到右的结合性(参见 here)并且

std::cout << 1 << 2 << std::endl;

可以认为是简写:

std::cout.operator<<(1).operator<<(2).operator<<(std::endl);

也就是说:没有歧义。

PS:同时考虑到你看到的“问题”不仅仅是<<的两个意思。运算符可以被重载以对自定义类型具有任何意义。然而 std::cout << custom_object_1 << custom_object_2; 呼叫 std::ostream& operator<<(std::ostream&,const custom_type&)。例如:https://godbolt.org/z/fn3PTz.

operator >>operator << 具有从左到右的结合性。这意味着加上一些括号,实际的表达式是

((std::cout << 1) << 2) << std::endl;

在这里您可以看到,在每次调用时,流对象或流表达式的 return 都用作每个表达式的左侧。这意味着所有值都将插入到流中。