この定義は機能します:
const auto &b{nullptr};
これは失敗しますが:
auto *b{nullptr};
これをVisual C++、GCC、およびClangでコンパイルしようとしました。彼らはすべて「型を推測できない」と文句を言います。
2番目の場合、b
はstd::nullptr_t
のような型を持つと推定されるべきではありませんか?
b
をpointerとして宣言し、nullポインターとして初期化するためです。しかし、あなたが言っていないデータのタイプへの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
に対応する指示先タイプはありません(nullptr
を逆参照することはできません)。
auto *b { nullptr};
存在しないタイプを要求します。 b
をnullptr_t
型にしたい場合は、単に書く
auto b { nullptr};