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