Порядок оценки функции 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;
}

Ответы на вопрос(3)

Ваш ответ на вопрос