24

我正在使用 g++ 4.4.1 并想使用nullptr,但我无法找到需要包含的头文件。它似乎也不是关键字,因为我使用它的尝试被拒绝为

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

4 回答 4

21

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)、隐式删除函数和隐式移动构造函数的支持.

对于早期版本的 GCC,如果您想nullptr尝试一下,可以尝试以下 SO 问题中的解决方法:

可以在 GCC 中模拟 nullptr 吗?

于 2010-09-21T00:18:13.250 回答
3

我建议不要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
于 2012-08-22T15:22:14.433 回答
2

我使用 -std=c++0x 来启用 gcc 4.6.3 的 nullptr 功能

于 2014-01-30T10:47:22.173 回答
2

如果您没有支持 C++11 的最新 gcc,请尝试使用 NULL 而不是 nullptr。

于 2015-07-14T05:37:46.607 回答