vector<int> v;
int f()
{
v.push_back(-1);
return 1;
}
int main()
{
v.push_back(0);
cout<<v[0]<<endl;
v[0]=f();
cout<<v[0]<<' '<<v[1]<<endl;
return 0;
}
expected output:
0
1 -1
output:
0
0 1
vector<int> v;
int f()
{
v.push_back(-1);
return 1;
}
int main()
{
v.push_back(0);
cout<<v[0]<<endl;
v[0]=f();
cout<<v[0]<<' '<<v[1]<<endl;
return 0;
}
expected output:
0
1 -1
output:
0
0 1
| № | Пользователь | Рейтинг |
|---|---|---|
| 1 | Benq | 3792 |
| 2 | VivaciousAubergine | 3647 |
| 3 | Kevin114514 | 3603 |
| 4 | jiangly | 3583 |
| 5 | strapple | 3515 |
| 6 | tourist | 3470 |
| 7 | dXqwq | 3436 |
| 8 | Radewoosh | 3415 |
| 9 | Otomachi_Una | 3413 |
| 10 | Um_nik | 3376 |
| Страны | Города | Организации | Всё → |
| № | Пользователь | Вклад |
|---|---|---|
| 1 | Qingyu | 157 |
| 2 | adamant | 152 |
| 3 | Proof_by_QED | 146 |
| 3 | Um_nik | 146 |
| 5 | Dominater069 | 144 |
| 6 | errorgorn | 141 |
| 7 | cry | 139 |
| 8 | YuukiS | 135 |
| 9 | chromate00 | 134 |
| 9 | TheScrasse | 134 |
| Название |
|---|



When evaluating
v[0]=f();vector resizes from 1 to 2, reallocation happens, but the left-hand side address is evaluated before reallocation happens, so you perform an assignment to the memory region that is not a content of a vector any more.The order of evaluation of sides in an assignment operator is not defined, thus you have UB.
This paper "Refining Expression Evaluation Order for Idiomatic C++" was proposed for the C++17 standard. Pretty sure that it also did get accepted, so it shouldn't be UB anymore. Though I didn't find any proof other than
g++ -std=c++17doing the expected thing.Btw, pretty funny that you are allowed to write C++ proposals in Word...
To get proof open the latest working draft based on c++17 branch n4659 and check if the changes from proposal are there. [Cppreference]http://en.cppreference.com/w/cpp/language/eval_order) is also a good source.
Yeah, should have checked it yesterday, but I was too tired.
Just for reference, the C++17 draft says: "The right operand is sequenced before the left operand." (under 8.18 Assignment and compound assignment operators)
Personally, I see no harm if it is written in Word, as long as the idea is clearly expressed :)
The following modification produces the expected output.
Global variables should be used carefully so as to avoid such unexpected side effects.
Best wishes
Thanks, it really was usefull.