鉴于此示例(这是关于更新回滚的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));
在这种情况下,调用i
后do_it
的值是否仍然保证为17
?在执行函数体之前,需要构造两个change
参数。
语言是否保证在函数开始之前构造所有参数? (如果没有保证,则编译器可能会延迟c2
的构造,直到c1
的{{1}}运行,因此最终值为operator()
)< / p>
答案 0 :(得分:4)
在调用函数之前,将评估函数调用的所有参数。评估参数的顺序是未指定的。
在你的情况下i
仍然是17。