Подтвердить что ты не робот

Какая разница в С++ между новыми int и new (int)?

какая разница между

int * num = new (int);

и

int * num = new int;

?

Есть ли разница вообще?

ИЗМЕНИТЬ спасибо all.... какой из них наиболее правильный ответ?

4b9b3361

Ответ 1

В контексте вашего примера нет разницы (с использованием типа int). Однако существует разница, если вам нужно создавать объекты сложных типов, где вам нужно использовать в скобках версию. то есть:

int (**fn_ptr_ok) ()  = new (int (*[10]) ()); // OK
int (**fn_ptr_err) ()  = new int (*[10]) (); // error 

Ответ 2

В этом конкретном случае нет никакой разницы. Оба они одинаковы. Просто этот первый синтаксис редко используется, может быть, потому, что он выглядит неудобным и загадочным, и требует больше ввода текста.

Ответ 3

Другое отличие, когда вы хотите создать динамический массив

int n = 2;
int *p = new int[n]; // valid
int *q = new (int[n]); // invalid

Версия в скобках требует постоянного размера.

Ответ 4

В этом вопросе значения этих двух new идентичны. Грамматически операнд прежней формы new () является идентификатором типа, а операнд последнего - идентификатор нового типа. Что касается идентификатора нового типа, если (....) появляется в конце операнда, это интерпретируется как список аргументов конструктора. То есть, если мы пишем new int(1), int инициализируется 1. С другой стороны, что касается идентификатора типа, если появляется (....), он является частью типа. Например, когда мы new указатель на функцию, мы должны использовать new( type-id ). Например, как new( int(*)() ).

Ответ 5

(Не совсем ответ, но я не могу добавить это в комментарий)

Его еще сложнее из-за "размещения нового": 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.