25

Wygląda na to, że dostajemy zupełnie nowy rodzaj "pytań do wywiadu" dla C++ (mam nadzieję, że nie).Co oceni + ++ + i ++ w C++ 17?

Wiadomo być niezdefiniowane zachowanie przed C++ 17, ale będzie dobrze zdefiniowane z C++ 17 dalej?

Ponieważ obecnie nie ma kompilatora, który implementuje tę modyfikację C++ 17, czy ktoś może wyjaśnić, co według następujących reguł oceny wartości: x będzie miało następujący kod?

int i = 0; 
int x = i++ + i++; 

Alisdair Meredith wspomina ten przykład here w jego CppCon 2016 Dyskusja, ale to nie jest do końca jasne do mnie co ostateczna wartość x będzie (chociaż wydaje się to, co on mówi, że będzie to co najmniej 1).

Samo w takim przypadku i będzie miało 2 na końcu wyrażenia.

+0

Możesz przeczytać np. [ten numer porządkowy i kolejność oceny zamówienia] (http://en.cppreference.com/w/cpp/language/eval_order). –

+4

@LeoHeinsaar Wydaje się, że musimy dostosować nasz refleks w przyszłości; P ... –

+1

@ πάνταῥεῖ Rozumiem, nawet się nie martw. W porządku. :-) –

Odpowiedz

18

P0145R3 (PDF) nie zmienia kolejności oceny wszystkich wyrażeń. Dotyczy tylko niewielkiej liczby operatorów. Dodatek binarny nie znajduje się na tej liście.

Dlatego powyższy kod pozostaje niezdefiniowany.

+1

Ale Alisdair wyraźnie mówi na swoim slajdzie, że jest * dobrze zdefiniowany *. Wątpię, czy to niedopatrzenie, czy też nie? –

+2

Jestem pewien, że Alisdair to powiedział, ale jestem tak pewny, że P0145R3 się z nim nie zgadza. Starsza wersja P0145 rzeczywiście oferowała zamawianie operatorów binarnych w ogólności, ale obecna wersja ma bardziej ograniczony zakres. Więc idę z tym, co jest napisane w gazecie, a nie na slajdzie. –

+1

@LeoHeinsaar Patrz sekcja 5 pliku PDF. – NathanOliver