c++ - nullptr_t - 什么是NULL的非指针等价物?



c++引用 (2)

下面的代码不会给出错误,因为标准非常保守。

一些代码结构非常复杂,编译器无法知道函数的结尾是否可以到达。 因此,标准说编译器不必证明该函数正确返回一个值...

然而 ,标准没有说如果一个函数没有返回值就正常结束(没有例外),那么调用Undefined Behavior (即任何事情都可能发生,可能是崩溃)。 因此,大多数编译器都有这样的警告 ,对于gcc和Clang你可以使用-Wreturn

现在,空或者前哨值的原理并不新鲜,空指针只是一个化身(其中很多)。

如果你的对象是无效的(它很少做,但可以是一个权宜之计)是没有意义的,那么你有两个选择:

  • throw异常来指示错误
  • 返回可能为null的包装类(如boost::optional<ObjectType>

在这种情况下,既然Find可能找不到任何东西,我一般会建议后者。

用法很简单:

boost::optional<ObjectType> MyClass::FindObjectType(char const* objectTypeName )
{
    if ( objectTypeMap.find( objectTypeName ) == objectTypeMap.end() ) {
        // do not print anything, it is up to the caller to decide what to do
        return boost::none;
    }

    return objectTypeMap[ objectTypeName ];
}

然后来电者写道:

int main(int argc, char* argv[]) {
    if (boost::optional<ObjectType> o = MyClass::FindObject(argv[1])) {
        o->foo();

        return 0;
    }

    Msg( "\n[C++ ERROR] No object type: %s", argv[1]);
    return 1;
}

https://ffff65535.com

为我的不适当的术语道歉。

我有一段代码返回一个空指针,如果一个条目不存在:

ObjectType * MyClass::FindObjectType( const char * objectTypeName )
{
    if ( objectTypeMap.find( objectTypeName ) == objectTypeMap.end() )
    {
        Msg( "\n[C++ ERROR] No object type: %s", objectTypeName );
        return NULL;
    }
    else
        return &objectTypeMap[ objectTypeName ];
}

我想做同样的事情,但这次返回一个对象,而不是一个指针。 下面的代码不给我任何编译器错误(这令我感到惊讶):

ObjectType MyClass::FindObjectType( const char * objectTypeName )
{
    if ( objectTypeMap.find( objectTypeName ) == objectTypeMap.end() )
    {
        Msg( "\n[C++ ERROR] No object type: %s", objectTypeName );
    }
    else
        return objectTypeMap[ objectTypeName ];
}

用指针我可以检查是否没有找到这样的条目:

if ( FindObjectType( objectType ) == NULL )
    //Do something

如何执行与返回的对象等效的检查?


对象没有语言级别的等价物。

一个选择是创建一个“哨兵”的对象,保证比较不等于任何“真实”的对象,并返回:

class ObjectType {
public:
    static const ObjectType null;

    bool operator==(const ObjectType &rhs) const { /* need an appropriate comparison test */ }

    ...
};

ObjectType ObjectType::null(/* something unique */);


...

ObjectType foo(const char *objectTypeName) {
    if (cond) {
        return objectTypeMap[objectTypeName];
    } else {
        return ObjectType::null;
    }
}


...

if (foo(objectType) == ObjectType::null) {
    std::cout << "Returned the null object\n";
}




null