web-dev-qa-db-ja.com

auto * p {nullptr}がC ++ 17で機能しないのにconst auto&p {nullptr}が機能するのはなぜですか?

この定義は機能します:

const auto &b{nullptr};

これは失敗しますが:

auto *b{nullptr};

これをVisual C++、GCC、およびClangでコンパイルしようとしました。彼らはすべて「型を推測できない」と文句を言います。

2番目の場合、bstd::nullptr_tのような型を持つと推定されるべきではありませんか?

31
felix

bpointerとして宣言し、nullポインターとして初期化するためです。しかし、あなたが言っていないデータのタイプへのnullポインタなので、コンパイラはそのタイプを推測できません。

bstd::nullptr_tオブジェクトにする場合は、アスタリスクを削除する必要があります。

auto b{nullptr};
37

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
16
Jarod42

nullptrstd::nullptr_t型です。 nullptrは何もポイントしないため、std::nullptr_tに対応する指示先タイプはありません(nullptrを逆参照することはできません)。

auto *b { nullptr};

存在しないタイプを要求します。 bnullptr_t型にしたい場合は、単に書く

auto b { nullptr};