Есть ль какой то смысл в том что, данные ниже, две записи оператора new выполняют одно и тоже?
Что компилятор из второго варианта просто убирает скобки, или такая форма тоже правальная и эквивалентна первой?
Я спрашиваю это потому, что это очень похоже на оператор размещения new, может быть это он так замаскировался и размещает "ничего" в какой то постоянной области (R), в которой уже живет R.
Здравствуйте, Аноним, Вы писали:
А>Есть ль какой то смысл в том что, данные ниже, две записи оператора new выполняют одно и тоже? А>Что компилятор из второго варианта просто убирает скобки, или такая форма тоже правальная и эквивалентна первой? А>Я спрашиваю это потому, что это очень похоже на оператор размещения new, может быть это он так замаскировался и размещает "ничего" в какой то постоянной области (R), в которой уже живет R.
Не похоже, т.к. в качестве параметров оператора new (как и у любого другого метода или функции) передаются значения, а не типы.
Это как sizeof(int) или sizeof int
Обычно при sizeof отделяют скобками, а при new пробелом, но это не обязательно.
Здравствуйте, Аноним, Вы писали:
А>Есть ль какой то смысл в том что, данные ниже, две записи оператора new выполняют одно и тоже? А>Что компилятор из второго варианта просто убирает скобки, или такая форма тоже правальная и эквивалентна первой? А>Я спрашиваю это потому, что это очень похоже на оператор размещения new, может быть это он так замаскировался и размещает "ничего" в какой то постоянной области (R), в которой уже живет R.
А>
R *pr1=new R;
А>R *pr2=new(R);
А>
Это связано с грамматикой C++, которая довольно-таки запутана. Если имя типа, который предстоит создать, содержит скобки, то new сочтет их частью new-initializer. Поэтому сложные имена типов позволяется заключать в скобки. Т. е., допускается «new (тип)» или «new (тип)(аргументы инициализатора)». И «new(аргументы)(тип)(аргументы инициализатора)» тоже.
За подробностями см. 5.3.4, в частности, пример в 5.3.4/3:
[Note: parentheses in a new-type-id of a new-expression can have surprising effects. [Example:
new int(*[10])(); // error
is ill-formed because the binding is
(new int) (*[10])(); // error
Instead, the explicitly parenthesized version of the new operator can be used to create objects of compound types (3.9.2):
new (int (*[10])());
allocates an array of 10 pointers to functions (taking no argument and returning int). ] ]
До последнего не верил в пирамиду Лебедева.
Re[2]: new(R);
От:
Аноним
Дата:
22.07.08 10:02
Оценка:
Это связано с грамматикой C++, которая довольно-таки запутана. Если имя типа, который предстоит создать, содержит скобки, то new сочтет их частью new-initializer. Поэтому сложные имена типов позволяется заключать в скобки. Т. е., допускается «new (тип)» или «new (тип)(аргументы инициализатора)». И «new(аргументы)(тип)(аргументы инициализатора)» тоже. RO>За подробностями см. 5.3.4, в частности, пример в 5.3.4/3:
А что за зверь
5.3.4/12
[Example:
— new T results in a call of operator new(sizeof(T)), — new(2,f) T results in a call of operator new(sizeof(T),2,f),
— new T[5] results in a call of operator new[](sizeof(T)*5+x), and — new(2,f) T[5] results in a call of operator new[](sizeof(T)*5+y,2,f).
Что означает число два? Это что размещают в размере увеличеном в/на два sizeof(T)?
Пример выделеного можно, а то нигде не нашёл.
Здравствуйте, Аноним, Вы писали:
А>Это связано с грамматикой C++, которая довольно-таки запутана. Если имя типа, который предстоит создать, содержит скобки, то new сочтет их частью new-initializer. Поэтому сложные имена типов позволяется заключать в скобки. Т. е., допускается «new (тип)» или «new (тип)(аргументы инициализатора)». И «new(аргументы)(тип)(аргументы инициализатора)» тоже. RO>>За подробностями см. 5.3.4, в частности, пример в 5.3.4/3:
А>А что за зверь А>
5.3.4/12
А>[Example:
А>— new T results in a call of operator new(sizeof(T)),
А>— new(2,f) T results in a call of operator new(sizeof(T),2,f),
А>— new T[5] results in a call of operator new[](sizeof(T)*5+x), and
А>— new(2,f) T[5] results in a call of operator new[](sizeof(T)*5+y,2,f).
А>Что означает число два? Это что размещают в размере увеличеном в/на два sizeof(T)? А>Пример выделеного можно, а то нигде не нашёл.
по моем просто вызов размещающего (по Майерсу это не только тот что адрес получает) нью определенного самим разработчиком.
Re[2]: Непонятки с placement new и локальными переменными
От:
Аноним
Дата:
22.07.08 11:10
Оценка:
Здравствуйте, Roman Odaisky.
Решил написать несколько тестов,
наткнулся на непонятное для меня поведение:
Выводит:
[0 55555 88888 4444]
MS VC++2005, пробовал и Debug и Release.
Я предполагал, что выводиться должен мусор, а получаю нормальные значения.
Это такая фича/бага VC++ или частый случай неопределённого поведения?
Что-то мне подсказывает, что new был "изобретен" "немного" раньше шаблонов и соответствующей формы записи (D&E под рукой нет, не могу проверить).
Re: Продолжение new перегрузка
От:
Аноним
Дата:
22.07.08 12:21
Оценка:
Продолжение...
Насколько правильны перегрузки операторов?
Особено настораживает первый: что будет с *str после окончания видимости, не будет ли она разрушена?
Alxndr пишет:
> Что-то мне подсказывает, что new был "изобретен" "немного" раньше > шаблонов и соответствующей формы записи (D&E под рукой нет, не могу
Точно так.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Непонятки с placement new и локальными переменными
Здравствуйте, Кодёнок, Вы писали:
RO>>Если имя типа, который предстоит создать, содержит скобки, то new сочтет их частью new-initializer.
Кё>И строго в традициях C++ было выбрано самое нелогичное решение. Должно было быть:
Кё>
"ComeauTest.c", line 4: warning: returning pointer to local variable
return &i;
^
"ComeauTest.c", line 16: error: expression must be an lvalue or a function
designator
Tmp *pt4 = new(&Tmp())Tmp;
Брр... Жуткое использование адреса локальных переменных вне области их действия. Быстренько учим матчасть!
Вас смущает, то что неопределённое поведение приводит к правильным результатам? На то оно и не определённое, что может привести к чему угоно — от правильной работы до форматирования жёсткого диска.
Здравствуйте, Аноним, Вы писали:
А>Продолжение... А>Насколько правильны перегрузки операторов?
Про "правильную" перегрузку оператора new написано у Майерса в его первой книге.
Re[4]: Непонятки с placement new и локальными переменными
От:
Аноним
Дата:
23.07.08 18:38
Оценка:
Здравствуйте, Arsenicum, Вы писали: A>Брр... Жуткое использование адреса локальных переменных вне области их действия. Быстренько учим матчасть!
Спасибо за наставления A>Вас смущает, то что неопределённое поведение приводит к правильным результатам? На то оно и не определённое, что может привести к чему угоно — от правильной работы до форматирования жёсткого диска.
Да, именно это меня смущает:
Я предполагал, что выводиться должен мусор, а получаю нормальные значения.
Это такая фича/бага VC++ или частый случай неопределённого поведения?
Просто результаты получились уж очень правильные.
Можно сказать, что это — недоделка дебажного режима Студии, такое поведение скрывает глюки.
Попробовал повысить уровень предупреждений с /W3 до /W4, получил след. предупреждения:
Tmp *pt4 = new(&Tmp())Tmp;
warning C4238: nonstandard extension used : class rvalue used as lvalue
И в случае возврата адреса локальной переменной из функции:
warning C4172: returning address of local variable or temporary
Comeau, несомненно, гораздо более информативен.
Re[5]: Непонятки с placement new и локальными переменными
# g++ -Wall test.cpp
g++ (GCC) 4.1.2 (Gentoo 4.1.2 p1.1)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
test.cpp: In function 'int* get_ptr()':
test.cpp:3: warning: address of local variable 'i' returned
test.cpp: In function 'int main()':
test.cpp:16: warning: taking address of temporary