<<
和>>
操作符在c++中有两种含义:位移动和流操作。编译器如何解决这种歧义时,意义不是明显从上下文中?以这句话为例:std::cout << 1 << 2 << std::endl;
输出是12
,如果第二个<<
被视为流插入,还是4
,如果第二个<<
被视为位移位?
operator >>
和operator <<
具有从左到右结合性。这意味着加上一些括号,实际的表达式是
((std::cout << 1) << 2) << std::endl;
,这里您可以看到,对于每个调用,流对象或流表达式的返回值被用作每个表达式的左侧。这意味着所有的值都将插入到流中。
没有歧义,因为编译器从左到右解释表达式,所以:
std::cout << 1 << 2 << std::endl;
等价于:
((std::cout << 1) << 2) << std::endl;
考虑<<
具有从左到右的结合律(见这里),并且
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.