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;
}