Почему 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};