Почему const auto & p {nullptr} работает, а auto * p {nullptr} не работает в C ++ 17? - PullRequest
0 голосов
/ 11 сентября 2018

Это определение работает:

const auto &b{nullptr};

пока не получится:

auto *b{nullptr};

Я попытался скомпилировать это в Visual C ++, GCC и Clang. Все они жалуются, что «не могут вывести тип».

Во втором случае, не следует ли b иметь такой тип, как std::nullptr_t?

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

nullptr относится к типу std::nullptr_t.Поскольку nullptr ни на что не указывает, для std::nullptr_t нет соответствующего типа pointee (вам не разрешено разыменовывать nullptr), поэтому

auto *b { nullptr};

запрашивает тип, который несуществовать.Если вы хотите, чтобы b был типа nullptr_t, просто напишите

auto b { nullptr};
0 голосов
/ 11 сентября 2018

decltype(nullptr) равно std::nullptr_t.

, поэтому с

const auto &b{nullptr}; // auto is std::nullptr_t
// b is a reference to a temporary (with lifetime extension)

, но nullptr НЕ является указателем (даже если он конвертируется в).

поэтому auto *b{nullptr}; недопустим.

Вы можете использовать вместо

auto b{nullptr}; // auto is std::nullptr_t
0 голосов
/ 11 сентября 2018

Это потому, что вы объявляете b указателем и инициализируете его нулевым указателем. Но нулевой указатель на тип данных, который вы не говорите, поэтому компилятор не может определить тип.

Если вы хотите, чтобы b был std::nullptr_t объектом, вы должны сбросить звездочку:

auto b{nullptr};
...