31

This definition works:

const auto &b{nullptr};

while this fails:

auto *b{nullptr};

I have tried to compile this in Visual C++, GCC, and Clang. They all complain "cannot deduce type".

In the second case, shouldn't b be deduced to have some type like std::nullptr_t?

Jarod42
  • 203,559
  • 14
  • 181
  • 302
felix
  • 2,213
  • 7
  • 16

3 Answers3

37

It's because you declare b to be a pointer, and initialize it to be a null pointer. But a null pointer to what type of data you don't say, so the compiler can't deduce the type.

If you want b to be a std::nullptr_t object, you should drop the asterisk:

auto b{nullptr};
Some programmer dude
  • 400,186
  • 35
  • 402
  • 621
  • 2
    Thanks! I have just realized that nullptr has type std::nullptr_t which is not a pointer.... It is strange but make sense in this case. – felix Sep 11 '18 at 11:20
  • 5
    @felix It ceases to be strange when you take into account that `nullptr` is convertible to both all pointer types and also all member pointer types. – Angew is no longer proud of SO Sep 11 '18 at 19:49
16

decltype(nullptr) is std::nullptr_t.

so with

const auto &b{nullptr}; // auto is std::nullptr_t
// b is a reference to a temporary (with lifetime extension)

but nullptr is NOT a pointer (even if it is convertible to).

so auto *b{nullptr}; is invalid.

You might use instead

auto b{nullptr}; // auto is std::nullptr_t
Jarod42
  • 203,559
  • 14
  • 181
  • 302
13

nullptr is of type std::nullptr_t. As a nullptr does not point to anything, there is no corresponding pointee type for std::nullptr_t (you are not allowed to dereference a nullptr), hence

auto *b { nullptr};

requests a type that does not exist. If you want b to be of type nullptr_t simply write

auto b { nullptr};
463035818_is_not_an_ai
  • 109,796
  • 11
  • 89
  • 185