Подтвердить что ты не робот

Какой заголовочный файл должен быть включен для использования nullptr в g++?

Я использую g++ 4.4.1 и хочу использовать nullptr, но я не могу найти, какой файл заголовка должен быть включен. Это тоже не похоже на ключевое слово, потому что моя попытка использовать его отклоняется как

error: 'nullptr' was not declared in this scope
4b9b3361

Ответ 1

GCC 4.4.1 не поддерживает nullptr.

Поддержка в nullptr была добавлена ​​в GCC 4.6.0: http://gcc.gnu.org/gcc-4.6/changes.html

Улучшена экспериментальная поддержка предстоящий стандарт С++ 0x ISO С++, , включая поддержку nullptr (спасибо к Магнусу Фредрейду), noexcept, неограниченные союзы, основанные на диапазонах (благодаря Родриго Ривасу Коста), неявно удаленные функции и неявные конструкторы перемещения.

Для более ранних версий GCC, если вы хотите поэкспериментировать с nullptr, вы можете попробовать обходной путь в этом вопросе SO:

Можно ли эмулировать nullptr в GCC?

Ответ 2

Я бы порекомендовал не использовать nullptr, как определено выше, потому что это может быть опасно. Если вы хотите использовать nullptr, следующее утверждение должно быть истинным.

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

Я использую -std = С++ 0x, чтобы включить функцию nullptr с gcc 4.6.3

Ответ 4

Если у вас нет последней версии gcc, которая поддерживает С++ 11, попробуйте использовать NULL вместо nullptr.