Порядок оценки функции C ++ в операторе присваивания
int& foo() {
printf("Foo\n");
static int a;
return a;
}
int bar() {
printf("Bar\n");
return 1;
}
void main() {
foo() = bar();
}
Я не уверен, какой из них следует оценить в первую очередь.
Я пытался в VC, что функция бара выполняется в первую очередь. Однако в компиляторе g ++ (FreeBSD) он выдает функцию foo, вычисленную первой.
Много интересного вопроса вытекает из вышеупомянутой проблемы, предположим, у меня есть динамический массив (std :: vector)
std::vector<int> vec;
int foobar() {
vec.resize( vec.size() + 1 );
return vec.size();
}
void main() {
vec.resize( 2 );
vec[0] = foobar();
}
Основываясь на предыдущем результате, vc оценивает foobar () и затем выполняет векторный оператор []. Это не проблема в таком случае. Однако для gcc, поскольку выполняется оценка vec [0], а функция foobar () может привести к изменению внутреннего указателя массива. Vec [0] может быть недействительным после выполнения foobar ().
Это означает, что мы должны отделить код так, чтобы
void main() {
vec.resize( 2 );
int a = foobar();
vec[0] = a;
}