c++ - ejemplo - use range based for loop instead
¿Por qué funciona const auto & p{nullptr} mientras que auto*p{nullptr} no funciona en C++ 17? (3)
Esta definición funciona:
const auto &b{nullptr};
mientras esto falla
auto *b{nullptr};
He intentado compilar esto en Visual C ++, GCC y Clang. Todos se quejan "no se puede deducir tipo".
En el segundo caso, ¿no debería deducirse b
tener algún tipo como std::nullptr_t
?
Es porque declara que b
es un puntero y lo inicializa como un puntero nulo. Pero un puntero nulo a qué tipo de datos no dice, por lo que el compilador no puede deducir el tipo.
Si desea que b
sea un objeto std::nullptr_t
, debe soltar el asterisco:
auto b{nullptr};
decltype(nullptr)
es std::nullptr_t
.
así que con
const auto &b{nullptr}; // auto is std::nullptr_t
// b is a reference to a temporary (with lifetime extension)
pero nullptr
NO es un puntero (incluso si es convertible a).
entonces auto *b{nullptr};
no es válido.
Puedes usar en su lugar
auto b{nullptr}; // auto is std::nullptr_t
nullptr
es de tipo std::nullptr_t
. Como nullptr
no apunta a nada, no hay un tipo de pointee correspondiente para std::nullptr_t
(no se le permite desreferenciar un nullptr
), por lo tanto
auto *b { nullptr};
solicita un tipo que no existe. Si quieres que b
sea de tipo nullptr_t
simplemente escribe
auto b { nullptr};