какая разница между
int * num = new (int);
и
int * num = new int;
?
Есть ли разница вообще?
ИЗМЕНИТЬ спасибо all.... какой из них наиболее правильный ответ?
какая разница между
int * num = new (int);
и
int * num = new int;
?
Есть ли разница вообще?
ИЗМЕНИТЬ спасибо all.... какой из них наиболее правильный ответ?
В контексте вашего примера нет разницы (с использованием типа int). Однако существует разница, если вам нужно создавать объекты сложных типов, где вам нужно использовать в скобках версию. то есть:
int (**fn_ptr_ok) () = new (int (*[10]) ()); // OK
int (**fn_ptr_err) () = new int (*[10]) (); // error
В этом конкретном случае нет никакой разницы. Оба они одинаковы. Просто этот первый синтаксис редко используется, может быть, потому, что он выглядит неудобным и загадочным, и требует больше ввода текста.
Другое отличие, когда вы хотите создать динамический массив
int n = 2;
int *p = new int[n]; // valid
int *q = new (int[n]); // invalid
Версия в скобках требует постоянного размера.
В этом вопросе значения этих двух new
идентичны.
Грамматически операнд прежней формы new ()
является идентификатором типа,
а операнд последнего - идентификатор нового типа.
Что касается идентификатора нового типа, если (....)
появляется в конце операнда, это
интерпретируется как список аргументов конструктора.
То есть, если мы пишем new int(1)
, int
инициализируется 1.
С другой стороны, что касается идентификатора типа, если появляется (....)
, он является частью типа.
Например, когда мы new
указатель на функцию, мы должны использовать
new( type-id )
.
Например, как new( int(*)() )
.
(Не совсем ответ, но я не могу добавить это в комментарий)
Его еще сложнее из-за "размещения нового": http://codepad.org/pPKt31HZ
#include <stdio.h>
void* operator new( size_t N, int x ) {
return new char[N];
}
int main( void ) {
int x = int();
int* a = new( int() ) int;
}
Здесь интересно, что gcc принимает это, но не MS/Intel.