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



<<>>操作符在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.

相关内容

  • 没有找到相关文章

最新更新