重载运算符 C++ 时的优先级

Precedence while overloading operators C++

我有一个 class,我在其中重载了一些运算符。我的代码是这样的:

myClass << 12 << 14 << 21 << 44

这很好用,首先运行 myClass << 12,然后运行 ​​myClass << 14

但是如果我尝试做这样的事情,我会遇到问题:

myClass << 12 << 14+18 << 36 << 14 << 47

运算符 + 也被重载,问题是 14+18myClass << 12 之前运行。我真的需要先执行myClass << 12,然后再执行14+18。我怎样才能做到这一点?

编辑:

我想将一些数字和数字数组放入流中。数字部分解决了。至于数字数组,我正在做这样的事情:

myClass << 12 << myClass(array,10) << 21 << 19

运算符()重载的地方,array是数字数组,10是数组的长度。我这样做是因为我需要一些方法来保持数组的长度,但问题是 myClass(array,10)myClass << 12 之前执行。所以,在这种情况下,我想首先将 12 放入流中,然后是我的数字数组,我需要知道它的长度。

而且,我不想使用这个解决方案:

myClass << 12
myClass << myClass(array,10)

因为我想将我的代码用作库,所以我的意图是最终用户可以灵活地在一行中编写所有内容。

您运行遇到了 sequence points 的问题。如果您想 运行 以保证顺序插入,则必须使用

myClass << 12;
myClass << 14+18;
myClass << 36;
myClass << 14;
myClass << 47;

好的,让我们简化和分解这里发生的事情。您调用的第一部分的计算结果如下:

myClass << 12 << myClass(array,10) 变为 myClass.operator<<(12).operator<<(myClass(array, 12) ,在理论上拼写出隐式 this 参数时变为 operator<<(operator<<(myClass, 12), myClass(array, 10))

现在,标准关于 operator<<(myClass, 12)myClass(array, 10) 的执行顺序的唯一说明是,两者都将在调用最外层的 operator<< 之前执行。在您的情况下,它选择先执行 operator()

现在,我们如何达到您想要的结果?首先,您可以将单个语句的各个部分放入多个语句中,以强制执行您想要的顺序。

或者,您可以完全不同地处理数组。我建议使用 format_array 函数:

std::string format_array(array, 10)
{
    // Do stuff
    return string representation of array
}

myClass << 12 << format_array(array,10) << 21 << 19

基于不同问题措辞的原始答案: 因为你不能超载 operator+(int, int) 我的心理问题阅读技巧告诉我你的 class 同时具有 operator<<operator+ 并且 operator+ 是某种class 上的状态操纵器,您希望在将 12 和 14 插入流后发生。

那样的话....不要那样做。这不是 operator+ 的目的,也不是标准流使用操纵器的原因。

但如果你绝对坚持:(myClass << 12 << 14) +18 << 36 << 14 << 47