Почему const auto & p{nullptr} работает, а auto * p{nullptr} - нет в C++17?

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

const auto &b{nullptr};

в то время как это не удается:

auto *b{nullptr};

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

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

3 ответов


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

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

auto b{nullptr};

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

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

auto *b { nullptr};

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

auto b { nullptr};