g++ 4.4.1 を使用していて、使用したいのですがnullptr
、インクルードする必要があるヘッダー ファイルを見つけることができません。私の試みは次のように拒否されるため、キーワードでもないようです。
error: 'nullptr' was not declared in this scope
GCC 4.4.1 はサポートしていませんnullptr
。
のサポートnullptr
が GCC 4.6.0 で追加されました:
http://gcc.gnu.org/gcc-4.6/changes.html
nullptr (Magnus Fromreide に感謝)、noexcept、無制限の共用体、範囲ベースの for ループ (Rodrigo Rivas Costa に感謝)、暗黙的に削除された関数、および暗黙的な移動コンストラクターのサポートを含む、今後の C++0x ISO C++ 標準の実験的サポートが改善され ました。 .
GCC の以前のバージョンでは、実験したい場合はnullptr
、この SO の質問で回避策を試すことができます。
nullptr
危険な場合があるため、上記の定義に従って使用しないことをお勧めします。nullptr
次のステートメントを使用する場合は、true にする必要があります。
sizeof(nullptr) == sizeof(void*) == sizeof(any pointer)
ただし、sizeof(nullptr)
(上で定義したように) この規則には準拠しません。実際には に評価されsizeof(bad nullptr) = 1
ます。
これは正しい実装です。
#pragma once
namespace std
{
//based on SC22/WG21/N2431 = J16/07-0301
struct nullptr_t
{
template<typename any> operator any * () const
{
return 0;
}
template<class any, typename T> operator T any:: * () const
{
return 0;
}
#ifdef _MSC_VER
struct pad {};
pad __[sizeof(void*)/sizeof(pad)];
#else
char __[sizeof(void*)];
#endif
private:
// nullptr_t();// {}
// nullptr_t(const nullptr_t&);
// void operator = (const nullptr_t&);
void operator &() const;
template<typename any> void operator +(any) const
{
/*I Love MSVC 2005!*/
}
template<typename any> void operator -(any) const
{
/*I Love MSVC 2005!*/
}
};
static const nullptr_t __nullptr = {};
}
#ifndef nullptr
#define nullptr std::__nullptr
#endif
C++11 をサポートする最新の gcc がない場合は、nullptr の代わりに NULL を使用してみてください。
-std=c++0x を使用して、gcc 4.6.3 で nullptr 機能を有効にします。