使用 << >> 运算符时的歧义
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 都用作每个表达式的左侧。这意味着所有值都将插入到流中。
<<
和>>
运算符在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 都用作每个表达式的左侧。这意味着所有值都将插入到流中。