
David B. Held wrote:
Jason Hise wrote:
Just wondering if there was any interest in a better null, or if such a thing existed in boost already. The code is relatively simple: [...]
Heh. Have you read what Scott Meyers has to say about this?
Also, the standard committeee paper N1601 (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1601.pdf) by Herb Sutter and Bjarne Stroustrup: #ifndef CPP0x_NULLPTR_N1601 #define CPP0x_NULLPTR_N1601 #if(__cplusplus <= 199711) // C++98 // A library implementation of N1601: provide nullptr semantics namespace std { class nullptr_t { void operator&() const; // address of nullptr cannot be taken public: template< typename T > operator T *() const // non-member pointer { return 0; } template< typename C, typename T > operator T C::*() const // member pointer { return 0; } }; } //__declspec(selectany) extern const std::nullptr_t nullptr; #endif #endif where: #include <iostream> #include <typeinfo> #include <nullptr> void f( char * ) { std::cout << "f( char * )\n"; } void f( int ) { std::cout << "f( int )\n"; } template< typename T > void g( T t ) { std::cout << "g( " << typeid(T).name() << " )\n"; } int main() { char * ch = nullptr; char * ch2 = 0; char * ch3 = true ? nullptr : nullptr; int n2 = 0; if( ch == 0 ) std::cout << "ch == 0\n"; if( ch == nullptr ) std::cout << "ch == nullptr\n"; if( ch ) std::cout << "ch\n"; if( n2 == 0 ) std::cout << "n2 == 0\n"; if( sizeof( nullptr ) == sizeof( void * )) std::cout << "sizeof( nullptr ) == sizeof( void * )\n"; std::cout << "typeid(nullptr).name() = " << typeid(nullptr).name() << '\n'; try{ throw nullptr; } catch( int ){ std::cout << "caught an integer\n"; } catch( std::nullptr_t ){ std::cout << "caught null pointer type!\n"; } try{ throw 0; } catch( std::nullptr_t ){ std::cout << "caught null pointer type!\n"; } catch( int ){ std::cout << "caught an integer\n"; } f( nullptr ); // calls f( char * ) f( 0 ); // calls f( int ) g( 0 ); // T = int g( nullptr ); // T = nullptr_t g(( float * )nullptr ); // T = float * # if 0 // error cases: char * ch4 = true ? 0 : nullptr; int n = nullptr; int n3 = true ? nullptr : nullptr; int n4 = true ? 0 : nullptr; if( n2 == nullptr ) std::cout << "n2 == nullptr\n"; if( nullptr ) std::cout << "nullptr\n"; if( nullptr == 0 ) std::cout << "nullptr == 0\n"; nullptr = 0; nullptr + 2; # endif return 0; } results in: ch == 0 ch == nullptr n2 == 0 typeid(nullptr).name() = class std::nullptr_t caught null pointer type! caught an integer f( char * ) f( int ) g( int ) g( class std::nullptr_t ) g( float * ) Regards, Reece