【问题标题】:Ambiguity when using << >> operators使用 << >> 运算符时的歧义
【发布时间】:2021-02-08 17:14:53
【问题描述】:

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

【问题讨论】:

  • 相关:运算符优先级不受运算符重载的影响。因此,与 &lt;&lt; 相同的优先规则只有一种解释。

标签: c++ stream bit-shift


【解决方案1】:

operator &gt;&gt;operator &lt;&lt; 具有从左到右的关联性。这意味着加上一些括号,实际的表达式是

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

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

【讨论】:

    【解决方案2】:

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

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

    相当于:

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

    【讨论】:

      【解决方案3】:

      考虑&lt;&lt; 具有从左到右的关联性(参见here)并且

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

      可以认为是简写方式:

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

      换句话说:没有歧义。

      PS:还要考虑到你看到的“问题”不仅仅是&lt;&lt;的两个含义。运算符可以重载以对自定义类型具有任何意义。尽管如此,std::cout &lt;&lt; custom_object_1 &lt;&lt; custom_object_2; 还是调用了std::ostream&amp; operator&lt;&lt;(std::ostream&amp;,const custom_type&amp;)。例如:https://godbolt.org/z/fn3PTz

      【讨论】:

        猜你喜欢
        • 2010-09-27
        • 2021-11-14
        • 2015-08-28
        • 1970-01-01
        • 2021-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-09
        相关资源
        最近更新 更多