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};