C++ nullptr
6153 ワード
次のコードを考慮します.
文字量0のタイプは、常にint
コンパイル期間int定数0は,ポインタに変換する場合に暗黙的にポインタに変換される.他の定数は、1、2、3...この待遇はない
0はこの特殊な待遇に値して、変数に出会うと使いにくくなります.例えば、11行目、変数xは、その値が0であっても役に立たない.この規則はテンプレートに続きます.たとえば、次のようになります.
これは、次のように呼び出されます.
最初の解決策は、templateを手動で書くことです.call( (int*)0); 欠点はありませんが、プログラマーがg(int*)のパラメータタイプを調べて、戻ってint*を0の前にコピーする必要があります.実際に任意のタイプを指す万能空ポインタが倒産したのは、優秀なプログラマーには許せないため、2つ目の案nullptrが導入された.
template_call(study::nullptr_t{})テンプレートパラメータのインスタンス化PointerType=study::nullptr_t
このようにg(study::nullptr_t{});g(int*)にマッチしませんね!!でもnullptrが見えましたtからint*への暗黙的な変換:
このように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
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