17

現在、C++11 では、何を使用することをお勧めしますZeroNULL? 2番目の場合の最初の?

int * p = getPointer();

if( 0 == p ){
    // something
}

if( NULL == p ){
    // something
}

更新:新しいものを忘れました

if( nullptr == p ){
    // something
}

更新 2:例は、null ポインターを書き込むためのオプションを示すことif( !p )です。

4

4 に答える 4

30

どちらでもないnullptr

しかし、あなたの場合、私はただ一緒に行きます

if ( !p ){
   //something
}

2.14.7 ポインタリテラル [lex.nullptr]

1 ポインタ リテラルはキーワードnullptrです。タイプの prvalue ですstd::nullptr_t。[ 注:std::nullptr_t は、ポインター型でもメンバー型へのポインターでもない特殊な型です。むしろ、この型の prvalue はヌル ポインター定数であり、ヌル ポインター値またはヌル メンバー ポインター値に変換できます。

于 2012-10-26T17:43:52.440 に答える
29

他の答えは正しいです。しかし、なぜ nullptrが優れているのかについてもう少し言いたかったのです。

C++11 では、「完全な転送」が非常に重要です。どこでも使用されています。明らかな場所はbindfunctionです。しかし、それはカバーの下の他の多くの場所でも使用されています. しかし、「完全な転送」は完全ではありません。失敗する場所の 1 つは、NULL ポインター定数です。

template <class T>
void display(T)
{
    std::cout << type_name<T>() << '\n';
}

template <class T>
void
f(T&& t)
{
    display(std::forward<T>(t));  // "perfectly forward" T
}

int main()
{
    f(0);
    f(NULL);
    f(nullptr);
}

の適切な定義によりtype_name<T>()、私のシステムでは次のように出力されます。

int
long
std::nullptr_t

これにより、動作中のコードとエラーを簡単に区別できます。運が良ければ、コンパイル時にエラーが発生します (恐ろしいエラー メッセージが表示されます)。ただし、状況によっては実行時エラーが発生することもあります。

コードでの 0 と NULL の使用を積極的に禁止します。

コードで完全な転送を行っていない場合でも、呼び出すコード (std::lib など) が内部でそれを使用している可能性が非常に高くなります。

于 2012-10-26T18:08:23.070 に答える
12

C++11 には新しいリテラル キーワードがありnullptrます。過負荷解決として使用される可能性がないため、このようなものよりも優れて0います。NULLint

if ( nullptr == p )

またはもちろん、bool コンテキストでポインタを使用することもできます。

if ( !p )
于 2012-10-26T17:46:04.083 に答える