参数计算和未定义行为

Parameter evaluation and undefined behavior

本文关键字:未定义 计算 参数      更新时间:2023-10-16

给出这个示例(这是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;
}

这里需要显式复制i(到orig)吗?或者可以更简单地写成:

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

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

语言是否保证在函数开始之前构造所有的形参?(如果没有保证,那么编译器可以延迟c2的构建,直到c1operator()运行之后,因此最终值将是11)

函数调用的所有形参都在调用函数之前求值。参数的求值顺序未指定。

在你的例子中,i仍然是17。