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