Учитывая этот пример (который является упрощением примера в документации для 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
s operator()
, и, таким образом, окончательное значение будет 11
)