web-dev-qa-db-ja.com

g ++でnullptrを使用するには、どのヘッダーファイルを含める必要がありますか?

G ++ 4.4.1を使用していて、nullptrを使用したいのですが、インクルードする必要があるヘッダーファイルを見つけることができません。キーワードとしても使用されていないように思われます。

error: 'nullptr' was not declared in this scope
23
Arun

GCC 4.4.1はnullptrをサポートしていません。

nullptrのサポートはGCC 4.6.0で追加されました: http://gcc.gnu.org/gcc-4.6/changes.html

今後のC++ 0x ISO C++標準の実験的サポートの改善、nullptrのサポートを含む(Magnus Fromreideのおかげ)、noexcept、無制限の共用体、範囲- forループ(Rodrigo Rivas Costaのおかげ)、暗黙的に削除された関数、暗黙的なmoveコンストラクターに基づいています。

GCCの以前のバージョンでは、nullptrを試してみたい場合は、このSO質問で回避策を試すことができます。

nullptrはGCCでエミュレートできますか?

21
ZoogieZork

危険なため、上記で定義した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
_
3
Yaroslav

C++ 11をサポートする最新のgccがない場合は、nullptrの代わりにNULLを使用してみてください。

2
lppier

-std = c ++ 0xを使用して、gcc 4.6.3でnullptr機能を有効にします

2
xsj0jsx