引入nullptr的原因,這個要從null說起。對於c和c++程式設計師來說,一定不會對null感到陌生。但是c和c++中的null卻不等價。null表示指標不指向任何物件,但是問題在於,null不是關鍵字,而只是乙個巨集定義(macro)。
在c中,習慣將null定義為void*指標值0:
[cpp]view plain
copy
print?
#define null (void*)0
但同時,也允許將null定義為整常數0
在c++中,null卻被明確定義為整常數0:
[cpp]view plain
copy
print?
// lmcons.h中定義null的原始碼
#ifndef null
#ifdef __cplusplus
#define null 0
#else
#define null ((void *)0)
#endif
#endif
[cpp]view plain
copy
print?
// 考慮下面兩個過載函式
void
foo(
inti);
void
foo(
char
* p)
foo(null); // which is called?
如果我們的編譯器是支援nullptr的話,那麼我們應該直接使用nullptr來替代null的巨集定義。正常使用過程中他們是完全等價的。
對於編譯器,visual studio 2010已經開始支援c++0x中的大部分特性,自然包括nullptr。而vs2010之前的版本,都不支援此關鍵字。
codeblocks10.5附帶的g++ 4.4.1不支援nullptr,公升級為4.6.1後可支援nullptr(需開啟-std=c++0x編譯選項)
0(null)和nullptr可以交換使用,如下示例:
[cpp]view plain
copy
print?
int* p1 = 0;
int* p2 = nullptr;
if(p1 == 0) {}
if(p2 == 0) {}
if(p1 == nullptr) {}
if(p2 == nullptr) {}
if(p1 == p2) {}
if(p2) {}
不能將nullptr賦值給整形,如下示例:
[cpp]view plain
copy
print?
intn1 = 0;
// ok
intn2 = nullptr;
// error
if(n1 == nullptr) {}
// error
if(n2 == nullptr) {}
// error
if(nullprt) {}
// error
nullptr = 0 // error
上面提到的過載問題,使用nullptr時,將呼叫char*。
[cpp]view plain
copy
print?
void
foo(
int)
void
foo(
char
*)
foo(0); // calls foo(int)
foo(nullptr); // calls foo(char*)
某些編譯器不支援c++11的新關鍵字nullptr,我們也可以模擬實現乙個nullptr。
[cpp]view plain
copy
print?
const
class
nullptr_t_t
template
<
class
c, class
t> operator t c::*()
const
private
: void
operator& ()
const
; } nullptr_t = {};
#undef null
#define null nullptr_t
C 11 新特性 引入nullprt
引入nullptr的原因,這個要從null說起。對於c和c 程式設計師來說,一定不會對null感到陌生。但是c和c 中的null卻不等價。null表示指標不指向任何物件,但是問題在於,null不是關鍵字,而只是乙個巨集定義 macro 在c中,習慣將null定義為void 指標值0 cpp view...
C 11 新特性 引入nullprt
引入nullptr的原因,這個要從null說起。對於c和c 程式設計師來說,一定不會對null感到陌生。但是c和c 中的null卻不等價。null表示指標不指向任何物件,但是問題在於,null不是關鍵字,而只是乙個巨集定義 macro 在c中,習慣將null定義為void 指標值0 cpp view...
C 11 新特性 引入nullprt
引入nullptr的原因,這個要從null說起。對於c和c 程式設計師來說,一定不會對null感到陌生。但是c和c 中的null卻不等價。null表示指標不指向任何物件,但是問題在於,null不是關鍵字,而只是乙個巨集定義 macro 在c中,習慣將null定義為void 指標值0 cpp view...