maxdiver раз мы обсуждаем Стандарт, то про про "надо" ничего не сказано. (или я ошибаюсь?) похоже никто не знает, кроме разрабов того или иного компилера
maxdiver > если имеется незнание основ языка, например, действия операторов или порядка вычислений аргументов функций? Какой ужас!!! Оказывается я не знаю основ языка!!! Сам maxdiver мне это сказал! Этого позора я не переживу... :'-(
RedLord А человек не знал именно этого - что никто не знает порядка вычисления Естественно, что в Стандарте безопасность исключений не обсуждается. Однако это "надо" явно следует из того, что 1) порядок вычисления параметров неизвестен; 2) механизм действия при возникновении исключения таков, что вызываются деструкторы только для уже сконструированных объектов. _DEN_ ))))))))))
_DEN_ > При чем тут порядок вычисления аргументов? Во-первых, я знаю что он не определен... Видимо не один я читаю посты по диагонали.
maxdiver обсуждается http://std.dkuug.dk/jtc1/sc22/wg21/docs/cwg_closed.html#130 только решается оно путем совета "как надо"
maxdiver Не стоит так категорично. Когда изучаешь язык методом живого программирования, часто случаются пробелы в "базовых" знаниях. Гораздо проще, имея практический опыт, шлифануться Стандартом, чем наоборот.
green Как ты смеешь так разговаривать с maxdiver?! Это же князь всея Сиплюсплюсии! maxdiver Исключения сами по себе безопасны и их безопасность обсуждать не нужно))
green Как ты смеешь так разговаривать с maxdiver?! Это же князь всея Сиплюсплюсии! maxdiver Исключения сами по себе безопасны и их безопасность обсуждать не нужно))
я тут провел один эксперимент. получается, что Intel, Comeau реализуют new+конструирование с учетом предложения Саттера. (а возможно исходя из других соображений) а вот VC8.0, к которому Саттер имеет непосредственное отношение - нет. и естественно все, исходя из Стандарта, правы
matich Извращаться так действительно не зачем. Разбор таких ситуаций просто помогает понять логику поведения, предписанную стандартом.
Я только вчера подключился. У Dev-C++ 4.9.9.2 тоже получается 3, однако только после замены словечка plus чемто другим (я использовал add) иначе прогу не уважает.
кстати говоря, конструкция типа foo(i++, j++) так же относится к числу весьма небезопасных, поскольку foo может быть и макросом типа: #define foo(a, b) ((a) < (b) ? (b) : (a)) "развертывание" которого ведет к ub
kaspersky Макросы в руках бабуина вообще штука стремная. И дело тут даже не в ++. Поставь в качестве аргументов вызов функции.
Код (Text): int plus(int a, int b, int c, int d) { return a + b + c + d; } int main() { int x = 0; x = ++x + ++x + ++x + ++x; printf("%d\n",x); x=0; x = plus(++x,++x,++x,++x); printf("%d\n",x); return 0; } >./a.out 11 16 gcc version 4.1.1
gcc -S test.c выдает: x = ++x + ++x + ++x + ++x; Код (Text): movl $0, -8(%ebp) incl -8(%ebp) incl -8(%ebp) movl -8(%ebp), %eax addl -8(%ebp), %eax incl -8(%ebp) addl -8(%ebp), %eax incl -8(%ebp) addl %eax, -8(%ebp) movl -8(%ebp), %eax что в переводе на русский означает Код (Text): x++ //x==1 x++ //x==2 eax = x //eax==2 eax += x //eax==4 x++ //x==3 eax += x //eax==7 x++ //x==4 x += eax //x==11 eax = x //eax==11