参数评估和未定义的行为

时间:2011-05-04 20:09:15

标签: c++ boost undefined-behavior

鉴于此示例(这是关于更新回滚的boost::multi_index_container文档中的示例的简化):

#include <iostream>

struct change
{
        int val_;
        change(int const &val) : val_(val)
        {
        }

        void operator() (int &v) const
        {
                v = val_;
        }
};

void do_it(int &v, change const &c1, change const &c2)
{
        c1(v);
        c2(v);
}

main()
{
        int i = 17;
        int orig = i;
        do_it(i, change(11), change(orig));
        std::cout << "i = " << i << std::endl;
}

此处是否需要iorig)的明确副本?或者这可以更简单地写成:

        int i = 17;
        do_it(i, change(11), change(i));

在这种情况下,调用ido_it的值是否仍然保证为17?在执行函数体之前,需要构造两个change参数。

语言是否保证在函数开始之前构造所有参数? (如果没有保证,则编译器可能会延迟c2的构造,直到c1的{​​{1}}运行,因此最终值为operator())< / p>

1 个答案:

答案 0 :(得分:4)

在调用函数之前,将评估函数调用的所有参数。评估参数的顺序是未指定的。

在你的情况下i仍然是17。