【问题标题】:Parameter order evaluation参数顺序评估
【发布时间】:2014-11-13 14:38:15
【问题描述】:

在标准的早期版本 (C++03) 中,未指定对函数调用的参数求值顺序。

这在标准的后续版本(C++11 或 C++14)中是否已更改?
即我们是否可以依赖特定的顺序(从左到右)。

【问题讨论】:

    标签: c++ parameters operator-precedence


    【解决方案1】:

    不,这并没有改变,但最近有一个改变它的提议:N4228: Refining Expression Evaluation Order for Idiomatic C++,这是Pre-Urbana mailing that came out this October 的一部分,介绍说(强调我的前进): p>

    表达式求值顺序是 C++ 社区。简而言之,给定一个表达式,例如 f(a, b, c), 子表达式 f , a , b , c 的求值顺序 标准未指定。如果其中任何两个 子表达式碰巧在不干预的情况下修改了同一个对象 序列点,程序的行为是未定义的。为了 例如,表达式 f(i++, i) 其中 i 是一个整数变量 导致未定义的行为

    它建议:

    我们建议修改 C++ 评估规则以支持已有数十年历史的 惯用构造和编程实践。一个简单的解决方案 将要求每个表达式都有一个明确的定义 评价顺序。该建议历来遭到反对 很多原因。相反,这提出了一个更有针对性的修复方法

    • 后缀表达式从左到右计算。 这包括 函数调用和成员节表达式
    • 赋值表达式从右到左计算。这包括复合作业。
    • 移位运算符的操作数从左到右计算

    更新

    Herb Sutter 最近在put out a poll on order of evaluation 寻求社区的一些反馈,以了解我们对以下代码的预期结果:

    std::vector<int> v = { 0, 0 };
    int i = 0;
    v[i++] = i++;
    std::cout << v[0] << v[1] << endl;
    

    这似乎表明委员会正在认真考虑评估顺序的主题,但正如我们从讨论中看到的那样,这是有争议的。

    【讨论】:

    • 这是针对即将到来的 C++17 还是仍在激烈讨论中?
    • @LokiAstari 不幸的是,我不是委员会的一员,所以我的见识非常有限,我在邮件发出后不久就阅读了这篇论文,这就是我能够如此迅速地回答的原因。这与缺陷报告无关,因此假设讨论支持该提议,它似乎必须成为 C++17 的一部分。从过去读到的内容和 cppcon 的各种对话来看,这似乎是一个有争议的提议。
    • @ShafikYaghmour 除非委员会的态度发生很大变化,否则该提案可能已被驳回。
    • @JamesKanze 我同意这会引起争议,但考虑到它针对的是一小部分表达式,所以这种方法可能会减少阻力。
    【解决方案2】:

    不,它在 C++11 中仍未指定。这样您的编译器就可以进行微优化,从而提高代码质量,并且因编译器而异。尝试 printf 在不同的编译器上进行增量操作。

    函数如 int i = foo(3) + bar(0);有未定义的行为,没有函数可以保证先运行。

    【讨论】:

    • 谢谢。但我很清楚它未指明的原因。但我听说它正在审查中,但不确定该更改是否已使其成为最新标准。
    • @LokiAstari 您可能希望将您听到的正在审核中的详细信息添加到您的问题中。我想这就是你问的原因,但对其他人来说可能并不明显。
    猜你喜欢
    • 2018-11-05
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2013-03-18
    • 2018-10-02
    相关资源
    最近更新 更多