С++: Инициализация указателя на указатель на int

Вот пример кода, который я запускал в Visual Studio 2010:

#include <iostream>

int main()
{
    int **p(NULL);
}

Я получаю эту ошибку: error C2059: syntax error : 'constant'

Но если я изменяю int **p(NULL); на int **p = NULL;, то указанный код компилируется отлично.

Проверено это на GCC (версия: 4.4.2), и оба работают нормально. Что мне здесь не хватает?

Ответ 1

Компилятор VС++ кажется путаным в отношении инициализации указателя на указатель...

Это работает, например,

int (**p)(NULL);

Это не

int *i;
int **p(&i);
int **o(NULL);

Это работает, хотя

int (**p)(&i);
typedef int* intp;
intp *o(NULL);

и т.д. шаблон не инициализируется, если присутствуют два **! Я думаю, ошибка! Кто-то из команды MSVC может подтвердить

Ответ 2

Это либо ошибка в самом компиляторе, либо, возможно, вы что-то сделали и попросили что-то еще.

MSVC10 поддерживает несколько функций из С++ 11, например:

int **p1 = nullptr;
int **p2{}; //initialized to nullptr!

Вы можете попробовать любой из них. Оба прекрасны.

Ответ 3

Похоже, дефект с Visual studio, он работает, если я использую С++ для компиляции @http://codepad.org/ и запускаю следующий код

int main() 
{     
    int **p(NULL); 
    return 0;
} 

То же работает с использованием компилятора g++.

Ответ 4

Вы получаете синтаксическую ошибку: видимо, NULL не определен. Вы должны включить cstdlib.