C++ порядок оценки функций в операторе присваивания

int& foo() {
   printf("Foo\n");
   static int a;
   return a;
}

int bar() {
   printf("Bar\n");
   return 1;
}

void main() {
   foo() = bar();
}

Я не уверен, какой из них должен быть оценен первым.

Я пробовал в VC, что функция bar выполняется первой. Однако, в компиляторе 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(), а затем выполняет vector operator[]. В таком случае проблем не возникает. Однако, для gcc, поскольку vec[0] оценивается, а функция foobar() может привести к изменению внутреннего указателя массива. После выполнения foobar() vec[0] может быть аннулирован.

Значит ли это, что нужно разделить код так, чтобы

void main() {
   vec.resize( 2 );
   int a = foobar();
   vec[0] = a;
}
8
задан Yiu Fai 29 November 2011 в 03:00
поделиться