43

C++ 11標準では、自分のインスタンスのアドレスを取得できるのに、のアドレスを取得することnullptr許可されていない理由がわかりません。予約済みのキーワードであるという事実を除けば、この決定には特定の理由がありますか?std::nullptr_tnullptr

単に私を楽しませるために、次の関数を使用してこの制限を回避しようとしました。

decltype(nullptr)* func(const decltype(nullptr) &nref) noexcept
{
    return const_cast<decltype(nullptr)*>(reinterpret_cast<const decltype(nullptr)*>(&nref));
}

reinterpret_castパラメータがないとヒステリックなエラーが発生するため、パラメータを使用する必要がありました。

error: invalid conversion from 'std::nullptr_t*' to 'std::nullptr_t*' [-fpermissive]

nullptrを直接渡してこの関数を呼び出すと、毎回異なるアドレスが取得されます。nullptr比較などのためにジャストインタイムで動的にアドレスが割り当てられますか? または (おそらくより可能性が高い) コンパイラは、基になるオブジェクトの一時的なコピーを強制していますか?

もちろん、これはどれも重要な情報ではありません。なぜこの特定の制限が実装されたのか (そして、なぜ私が今のような行動を見ているのか) が興味深いと思います。

4

4 に答える 4

82

値を与えた後5に an のアドレスを取得できるのに、のアドレスを取得できないのと同じです。a に代替値がないことは問題ではありません。int5nullptr_t

値にはアドレスがありません。オブジェクトはそうします。

一時オブジェクトは、そのような値をパラメーターに渡すか、名前付き参照を宣言または宣言するconst &などして値を const 参照にバインドすると生成されます。表示されているアドレスは一時的なものです。static_cast< T const & >( … )T const & foo = …;

于 2013-01-07T04:03:29.113 に答える
28

あなたが標準的な答えを求めているなら、§18.2 /9はあなたの観察をかなり率直に言います:

nullptrのアドレスを取得することはできませんが、左辺値である別のnullptr_tオブジェクトのアドレスを取得することはできます。

あるいは、§2.14.7はこれについて次のように述べていnullptrます:

ポインタリテラルはキーワードnullptrです。これは、タイプstd::nullptr_tのprvalueです。

では、prvalueとは何ですか?§3.10/1は次のように答えます。

prvalue(「純粋な」右辺値)は、x値ではない右辺値です。[例:戻り型が参照ではない関数を呼び出した結果は、prvalueです。12、7.3e5、またはtrueなどのリテラルの値もprvalueです。—終了例]

うまくいけば、例でそれらのいずれかのアドレスを取得しようとすると、のアドレスを取得できない理由についてより理にかなっていますnullptr。それはそれらの例の一部です!

于 2013-01-07T04:18:33.713 に答える
10

nullptrは (リテラル) 定数であり、コード内の他のリテラル定数と同様に、これらにはメモリ アドレスがありません。に似ていますが、オーバーロードの問題 (ポインターと整数) を避けるためではなく0、特別なstd::nullptr_t型です。void*

しかし、独自の変数を valuenullptrで定義すると、メモリ アドレスがあるため、そのアドレスを取得できます。

リテラル定数はプログラムに格納されないため(C++ ではカテゴリprvalueに分類される)、他の型のリテラル定数にも同じことが当てはまります (それらが発生する式の一部としてのみ)。アドレスについて話すのは理にかなっています。ただし、違いを指摘するために、定数変数にはアドレスがあります。

于 2013-01-07T04:09:45.443 に答える
4

true と false はどちらもキーワードであり、リテラルとして型 ( bool ) を持っています。nullptr は std::nullptr_t 型のポインター リテラルであり、prvalue (& を使用してそのアドレスを取得することはできません) です。また、nullptr は prvalue であるため、そのアドレスを取得することはできません。リテラル定数はプログラムに格納されません。

住所があっても意味がありません。

于 2013-01-07T09:43:20.257 に答える