推 Hazukashiine: 下次老師就會加註:「請用C++17規則作答」03/08 21:30
推 sinker5566: 感謝大大03/08 21:34
→ loveflames: 過度重視求值順序跟運算子優先順序,我覺得害處很大03/08 22:10
→ loveflames: 別人看到這種code還得去查表03/08 22:10
推 descent: 為什麼 c++17 要定這個標準?03/08 22:36
→ Caesar08: 因為有人發現,unspecified behavior會變成03/08 22:49
→ Caesar08: undefined behavior03/08 22:49
→ Caesar08: 讀p0145r3就可以知道原因了03/08 22:50
→ james732: 沒有明確的定義,有帶來任何好處嗎?03/08 23:29
推 wtchen: 感謝,已補充進13誡(覺得C++愈來愈龜毛)03/08 23:44
→ final01: 為啥到c++17才規定...03/08 23:50
→ uranusjr: 有規範是好事啦, 除非要讓它 syntax error 不然就是個雷03/09 00:03
→ uranusjr: 有規則的雷總比沒規則的雷要好03/09 00:03
→ loveflames: 不要過度使用就是03/09 00:08
→ MOONRAKER: 不明確定義,方便compiler自由發揮。03/09 05:02
補充一個比較複雜的例子
//A為函數指標陣列,f為物件的方法
i=0;
++i = A[i++](i++,++i).f(i++);
規則
E1 = E2: E2->E1
E1 = E2: E1與E2的計算->E1的賦值
E1(E2,E3): E1->E2->E3
推導過程
a[0](i++,++i).f(i++),i=1
a[0](1,++i).f(i++),i=2
a[0](1,3).f(i++),i=3
a[0](1,3).f(3),i=4
++i為前置運算,副作用早於計算, i=5
結果為i = a[0](1,3).f(3)
※ 編輯: loveflames (60.248.56.181), 03/09/2017 13:23:34
推 pili100: 這樣寫code有比較清楚嗎?定義這個感覺吃飽太閒03/09 17:44
→ loveflames: 定義是需要啦,不要濫用就好03/09 17:52
推 wtchen: C++17真的閒到去定義這個?03/09 18:14
→ loveflames: 我這篇寫的都有定義03/09 18:27
推 AstralBrain: E1(E2,E3)這裡的E2,E3應該沒規定順序?03/09 19:02
我得更正前面的結論
看到置底十三誡的f(++i,++i),沒查來源就直接套了
查規格書查半天都找不到
後來才知道在17雖然已不是undefined behavior
但仍是unspecified behavior
為避免混亂,這兩行不要理它
→ loveflames: 17有規定函數參數的求值順序03/09 19:22
→ loveflames: E1.E2應該要算成上面的那個,所以拿掉03/09 20:14
推 wtchen: 我寫的時候是參照這裡 03/09 23:10
推 wtchen: 已經把f(++i,++i)拿掉,感謝指正(真是亂到我都搞不懂) 03/09 23:12
→ loveflames: 除了這個例子沒找到,其他我在規格書都有翻到 03/09 23:28
→ loveflames: 大多寫在5.2節,而list-initIialization寫在其他地方 03/09 23:29
→ loveflames: f(i = -1, i = -1)不是從左到右,它合法的原因是 03/09 23:33
→ loveflames: 進入function前每個argument的副作用會處理完畢 03/09 23:40
推 wtchen: 不懂,那f(i=-1, i=1)的話,i會是-1還是1? 03/09 23:48
→ loveflames: unspecified behavior 03/10 00:15
→ loveflames: 左右方向隨編譯器定的 03/10 00:18
想到一個好例子,這個有查過規格書可以掛保證
T x(E1,E2); //unspecified
T x{E1,E2}; //E1 -> E2
※ 編輯: loveflames (36.237.103.169), 03/10/2017 10:15:38