分配顺序与初始化顺序

25 c++ initialization chaining assignment-operator

以此示例代码为例:

int a = 10;
int b = 20;
int c = 30;

int & foo1() {
    qDebug() << "foo1" << endl;
    return a;
}

int & foo2() {
    qDebug() << "foo2" << endl;
    return b;
}

int & foo3() {
    qDebug() << "foo3" << endl;
    return c;
}

int main(void)
{
    foo1() = foo2() = foo3() = 7;
}
Run Code Online (Sandbox Code Playgroud)

由于任务从右到左,我期望看到foo3第一个和foo1最后一个,但它是相反的.

Are the rules for such scenarios concretely defined and how? Also, does the compiler differentiate between assignment and other operators and how would that be possible if you are using the = operator in a different context than initialization? Maybe chain assignment is treated differently from other chaining?

Ral*_*zky 24

完整的表达

foo1() = foo2() = foo3() = 7
Run Code Online (Sandbox Code Playgroud)

可以使用以下树抽象:

     =
   /   \
foo1()   = 
       /   \
    foo2()   =
           /   \
        foo3()   7
Run Code Online (Sandbox Code Playgroud)

可以按任何顺序评估该树的叶子.您的编译器可以自由选择.仅用于调用赋值运算符时,必须首先计算挂在它们上的表达式.在您的情况下,叶子将按顺序进行评估foo1(),foo2()然后进行评估foo3().

从右到左的关联性=只能在树的形状中看到,而不是按照评估的顺序.树为

std::cout << foo1() << foo2() << foo3()
Run Code Online (Sandbox Code Playgroud)

好像

                   << 
                 /    \
              <<      foo3()
            /    \
         <<      foo2()
       /    \
std::cout   foo1()
Run Code Online (Sandbox Code Playgroud)

同样,foo可以按任何顺序评估函数,但是operator<<()明确定义了评估的顺序.有一篇关于序列点的有趣帖子很好地描述了这些主题.


Oli*_*rth 15

操作员关联性(即从右到左)与评估顺序无关.* 操作数的评估顺序未指定.


*除了在少数情况下,即&&,||,.