Почему я не могу инициализировать автоматически выведенный указатель с помощью nullptr? - PullRequest
0 голосов
/ 23 января 2019

Я пытался сделать что-то похожее на это:

auto foo = int*(nullptr);

, который с VC ++ не компилируется с сообщением об ошибке:

Имя типа не разрешено

А с GCC 8.2 не компилируется с:

Ожидаемое первичное выражение до 'int'

Мне было действительно любопытно, почему этопредставляется неправильным синтаксисом.На мой взгляд, все должно быть в порядке, поскольку литералы могут быть инициализированы следующим образом.

auto foo = int(2);

Единственный способ придумать, как заставить это работать, - это создать псевдоним типа или сделать это:

auto foo = std::add_pointer_t<int>(nullptr);

Я пытался найти это, но, честно говоря, я даже не знаю, как правильно сформулировать этот вопрос, так как мой стандарт слаб.Любое понимание будет оценено!

Ответы [ 2 ]

0 голосов
/ 23 января 2019

int*(nullptr) не работает, потому что только имя типа с одним словом может использоваться в функциональном выражении приведения . Обратите внимание, что int* не является именем типа, состоящим из одного слова, в то время как int является (и тогда int(2) работает нормально).

Функциональное выражение приведения состоит из простого спецификатора типа или спецификатора определения типа (другими словами, имя типа из одного слова: unsigned int(expression) или int*(expression) недопустимы), за которым следует одиночное выражение в скобках.

В качестве обходного пути вы можете использовать typedef,

typedef int* int_pointer;
auto foo = int_pointer (nullptr);

или измените его на выражение в стиле c.

auto foo = (int*) nullptr;
0 голосов
/ 23 января 2019

int* - это «производный тип объявления» (не стандартный термин, но полезный для рассуждений об этом). Нотация приведения в функциональном стиле (то есть то, чем является int(2)) может содержать только "Спецификатор простого типа или спецификатор типа" . Производный тип объявления не попадает ни в одну из категорий.

Вы должны либо:

  • запишите это в форме броска в стиле C:

    auto foo = (int*) nullptr;
    
  • или в форме приведения в стиле C ++:

    auto foo = static_cast<int*>(nullptr);
    
  • или псевдоним типа указателя:

    using iptr = int*;
    auto foo = iptr(nullptr);
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...