Какая разница в c ++ между new int и new (int)? - PullRequest
21 голосов
/ 18 марта 2011

В чем разница между

int * num = new (int);

и

int * num = new int;

?

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

РЕДАКТИРОВАТЬ Спасибо всем.... какой самый правильный ответ 1014 *?

Ответы [ 5 ]

14 голосов
/ 18 марта 2011

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

int (**fn_ptr_ok) ()  = new (int (*[10]) ()); // OK
int (**fn_ptr_err) ()  = new int (*[10]) (); // error 
10 голосов
/ 18 марта 2011

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

6 голосов
/ 18 марта 2011

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

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

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

2 голосов
/ 18 марта 2011

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

1 голос
/ 19 марта 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...