C++ nullptr

6153 ワード

次のコードを考慮します.
 1 void g(int* i){  }
 2 
 3 int main(){
 4 
 5     g(0); //ok   g((int*)0)
 6 
 7     const int x = 0;
 8     g(x); //ok   g((int*)0)
 9     
10     int x=0;
11     g(x);  //error.     ,int    int*
12     
13     return 0;
14     
15 }

文字量0のタイプは、常にint
コンパイル期間int定数0は,ポインタに変換する場合に暗黙的にポインタに変換される.他の定数は、1、2、3...この待遇はない
0はこの特殊な待遇に値して、変数に出会うと使いにくくなります.例えば、11行目、変数xは、その値が0であっても役に立たない.この規則はテンプレートに続きます.たとえば、次のようになります.
template<class PointerType>
void template_call( PointerType x ){
    g(x);
}

void g(int* i){}

int main(){
    template_call(0);
}

これは、次のように呼び出されます.
void template_call( int x )
{
    g(x); //11      
}

最初の解決策は、templateを手動で書くことです.call( (int*)0); 欠点はありませんが、プログラマーがg(int*)のパラメータタイプを調べて、戻ってint*を0の前にコピーする必要があります.実際に任意のタイプを指す万能空ポインタが倒産したのは、優秀なプログラマーには許せないため、2つ目の案nullptrが導入された.
namespace study {

    const class nullptr_t
    {
    public:
        template<class T>
        inline operator T*() const  //    
        {
            return 0;
        }

        template<class C, class T>  //    
        inline operator T C::*() const
        {
            return 0;
        }

        void operator&() const = delete;
    } ;
}

template<class PointerType>
void template_call( PointerType a ){
    g(a);
}

void g(int* i){  }

int main(){
    //  :template_call((int*)0)
    template_call( study::nullptr_t{} );
}

template_call(study::nullptr_t{})テンプレートパラメータのインスタンス化PointerType=study::nullptr_t
このようにg(study::nullptr_t{});g(int*)にマッチしませんね!!でもnullptrが見えましたtからint*への暗黙的な変換:
const class nullptr_t
    {
    public:

        inline operator int*() const  //    
        {
            return 0;
        }

このようにg(study::nullptr_t{}.operator int*();int*tmp=0です.g(tmp);の展開結果が出ました.万能空の針がまた戻ってきた.
f( study::nullptr_t{}); 標準ライブラリstd名前空間ではf(std::nullptr_t{});でもやっぱり0簡潔じゃないですね!!
一般的な考え方では、constexpr std::nullptr_などのグローバルオブジェクトを定義できます.t nullptr; そして、f(std::nullptr)に簡略化する.でも前のstd::5文字は複雑すぎる!!
nullptrはもはやグローバルオブジェクトではなく、キーワードとして収録されています!!for、classのようです.これでいいですよ.std::節約しました.f(nullptr)になります
f(nullptr)はf(0)より6文字多く叩くが、f(NULL)より3文字しか多く叩くことができず、まあまあのようだ.nullptrをnpをキーワードに変更すると、f(np)はキーボードをより省くのではないでしょうか.
 
転載先:https://www.cnblogs.com/thomas76/p/8592904.html