【问题标题】:X().Y(Z()) and the order of evaluation in standardX().Y(Z()) 和标准中的评估顺序
【发布时间】:2016-06-07 21:12:50
【问题描述】:

有人可以引用 C++ 标准的相应段落,即在以下情况下未指定 std::string 构造和 foo() 调用的顺序:

std::string().append(foo());

我知道有 5.2.2.8 但它说明的是函数参数,而不是同一序列点之间的多个函数调用:

函数参数的求值顺序未指定

【问题讨论】:

  • 5.2.2.5 "如果函数是非静态成员函数,函数的this参数([class.this])应该用指向调用对象的指针初始化,转换好像通过显式类型转换([expr.cast])。”似乎表明它被视为函数的隐含 this 参数的来源,但我不会把钱花在我的阅读正确上,因为我没有彻底阅读这部分标准。

标签: c++ language-lawyer operator-precedence


【解决方案1】:

人们普遍认为,不定义表达式求值的顺序会导致更多优化。 10 和 20 年前可能是这样,但现在似乎不再如此。这方面的数据已提交给委员会,但我不知道它是否在任何地方发布。

【讨论】:

    【解决方案2】:

    5/4 [expr]:

    除非另有说明,单个运算符的操作数和单个表达式的子表达式的计算顺序以及副作用发生的顺序是未指定的

    由于运算符是函数,这意味着string() 将在foo() 之前或之后构造。

    另见:Order of function call

    “Bjarne Stroustrup 也在“The C++ Programming Language”第 3 版第 6.2.2 节中明确表示,并有一些推理:

    可以在没有表达式求值顺序限制的情况下生成更好的代码。

    另见:Order of evaluation in C++ function parameters

    【讨论】:

    • 这里的“操作员”是什么意思? operator.?
    • 不,像operator+ 抱歉没有澄清...(虽然operator. 也被归类为函数。)
    猜你喜欢
    • 2011-11-08
    • 2021-09-13
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 2022-01-22
    相关资源
    最近更新 更多