Здравствуйте, Vamp, Вы писали:
BF>>msvc ТАКОЕ спокойно компилит, даже без ворнингов. V>Странно. new char[20] возвращает rvalue. А какая версия?
2003-я .
Надо бы на 2005-й проверить.
On Tue, 29 Nov 2005 14:17:06 +0200, BitField <16909@users.rsdn.ru> wrote:
> Друг начал учить С++. Посмотрев на одну из его программ, я надолго впал в ступор.... > Вот вырезка: >
> int main(int argc, char * argv[])
> {
> char * text = new char [20] = "Hello world";
> printf("%s", text);
> return 0;
> }
>
> msvc ТАКОЕ спокойно компилит, даже без ворнингов. > gcc послал.
gcc таки послал — сказал што нельзя присваивать значения непеременними:
(я сним согласен )
main.cpp:9: error: ISO C++ forbids cast to non-reference type used as lvalue
main.cpp:9: error: ISO C++ forbids cast to non-reference type used as lvalue
7.1 — сожрал и даже виполнил видав нагора "Hello world", вот уж действительно:
"Hello world" !!!
— помоему просто баг.
BF>msvc ТАКОЕ спокойно компилит, даже без ворнингов.
Немного модифицировал, что бы понять, что происходит.
$SG3747 DB'Hello world', 00H
$SG3748 DB'%s', 00H
_main PROC
; выдел место в стеке под переменную text
push ecx
; new char [20];
; указатель на выделенную память нигде не сохраняется!
push 20 ; 00000014H
call ??2@YAPAXI@Z ; operator new
; char * volatile text = "Hello world";
mov DWORD PTR _text$[esp+8], OFFSET $SG3747
; printf("%s", text);
mov eax, DWORD PTR _text$[esp+8]
push eax
push OFFSET $SG3748
call _printf
; return 0;
xor eax, eax
add esp, 16
ret 0
_main ENDP
Так что new всё-таки не lvalue. Каким таким чудом компилятор выполнил присваивание "вокруг него"
Подобный баг наводит на мысль — что этот пример ещё цветочки. Сколько может быть таких вещей в "работающих" программах?
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, gear nuke, Вы писали:
GN>Здравствуйте, BitField, Вы писали:
GN>Немного модифицировал, что бы понять, что происходит. GN>Так что new всё-таки не lvalue. Каким таким чудом компилятор выполнил присваивание "вокруг него" GN>Подобный баг наводит на мысль — что этот пример ещё цветочки. Сколько может быть таких вещей в "работающих" программах?
>; указатель на выделенную память нигде не сохраняется!
Ну да.
А зачем?
Поставим скобки согласно правилам С++:
char * volatile text = (new char [20] = "Hello world");
>Так что new всё-таки не lvalue.
Почему такой вывод?
Правильно работающая программа — просто частный случай Undefined Behavior
Здравствуйте, _Winnie, Вы писали:
>>; указатель на выделенную память нигде не сохраняется! _W>Ну да. _W>А зачем?
А зачем тогда оптимизатор не выкинул выделение памяти?
Результат не сохраняется — имеет право. Но не сделал.
_W>Поставим скобки согласно правилам С++: _W>
_W> char * volatile text = (new char [20] = "Hello world");
Поведение компилятора не меняется.
>>Так что new всё-таки не lvalue. _W>Почему такой вывод?
Мой вывод такой:
после некоторых преобразований, выражение приводится компилятором к виду:
new char [20];
char * volatile text = "Hello world";
Компилятор не рассматирвает new как lvalue в таком контексте.
Он его из контекста выкидывает!
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, gear nuke, Вы писали:
GN>Здравствуйте, _Winnie, Вы писали:
>>>; указатель на выделенную память нигде не сохраняется! _W>>Ну да. _W>>А зачем?
GN>А зачем тогда оптимизатор не выкинул выделение памяти? GN>Результат не сохраняется — имеет право. Но не сделал.
Не имеет. Выражение new вызывает (рано или поздно, прямо или косвенно) библиотечную функцию (operator new, malloc или платформозависимый эквивалент), а это observable behavior (1.9/6).
Здравствуйте, Centaur,
GN>>А зачем тогда оптимизатор не выкинул выделение памяти? GN>>Результат не сохраняется — имеет право. Но не сделал.
C>Не имеет. Выражение new вызывает (рано или поздно, прямо или косвенно) библиотечную функцию (operator new, malloc или платформозависимый эквивалент), а это observable behavior (1.9/6).
The observable behavior of the abstract machine is its sequence of reads and writes to volatile data and
calls to library I/O functions.
А operator new — это I/O функция?
Если да, то почему тогда выделение памяти под auto переменные не является observable behavior?
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth