这段代码定义得很好吗?

Zac*_*Saw 8 c++ operator-precedence sequence-points c++11

我怀疑根据C++标准(假设C++ 0x),以下链接函数会导致未指定的序列.只是想要一个确认,如果有人可以提供解释,我会很感激.

#include <iostream>

struct TFoo 
{
    TFoo(int) 
    {
        std::cout<<"TFoo"<<std::endl;
    };
    TFoo foobar1(int) 
    {
        std::cout<<"foobar1"<<std::endl;
        return *this;
    };
    TFoo foobar2(int) 
    {
        std::cout<<"foobar2"<<std::endl;
        return *this;
    };
    static int bar1() 
    {
        std::cout<<"bar1"<<std::endl;
        return 0;
    };
    static int bar2() 
    {
        std::cout<<"bar2"<<std::endl;
        return 0;
    };
    static int bar3()
    {
        std::cout<<"bar3"<<std::endl;
        return 0;
    }
};

int main(int argc, char *argv[])
{
    // is the sequence well defined for bar1, bar2 and bar3?
    TFoo(TFoo::bar1()).foobar1(TFoo::bar2()).foobar2(TFoo::bar3());
}
Run Code Online (Sandbox Code Playgroud)

*编辑:删除函数的__fastcall说明符(不需要/与问题相关).

Nem*_*emo 8

未指定评估顺序.C++ 0x规范草案的相关部分是1.9,第14和15段:

14与相关联的每个值的计算和副作用全表达测序与下一个相关联的每一个值的计算和副作用之前全表达进行评估.

15除非另有说明,否则对单个算子的操作数和个别表达式的子表达式的评估是不确定的.

这里相关的完整表达是:

TFoo(TFoo::bar1()).foobar1(TFoo::bar2()).foobar2(TFoo::bar3());
Run Code Online (Sandbox Code Playgroud)

所以对其子表达式的评估是没有排序的(除非我错过了某个例外).

我很确定早期的标准包括具有相同效果的语言,但就"序列点"而言.

[编辑]

第15段还说:

当调用函数时(无论函数是否为内联函数),与任何参数表达式相关联的每个值计算和副作用,或者使用指定被调用函数的后缀表达式,都会在执行每个表达式或语句之前对其进行排序.叫功能.[注意:与不同参数表达式相关的值计算和副作用未被排序.-结束语]

"指定被调用函数的后缀表达式"就像是foo().barin foo().bar().

这里的"注释"仅仅阐明了参数评估顺序不是 "未指定顺序"默认的例外.通过推断,与"指定被调用函数的后缀表达式"相关联的评估顺序也不是; 或者如果您愿意,可以使用this参数表达式的评估顺序.(如果有异常,这将是指定它的自然位置.或者可能是第5.2.2节讨论函数调用.两个部分都没有说明此示例的评估顺序,因此未指定.)