c++ 我可以将nullptr转换为其他指针类型吗?

x6492ojm  于 2022-11-27  发布在  其他
关注(0)|答案(4)|浏览(295)

我可以这样做吗?

static_cast<A*>(getSomePtr());

其中getSomePtr()将返回nullptr。这样可以吗?

jum4pzuy

jum4pzuy1#

  • 维基百科文章:
    ...空指针常量:nullptr。它属于nullptr_t类型,可以隐式转换为任何指针类型或指向成员的指针类型,也可以与任何指针类型或指向成员的指针类型进行比较。它不能隐式转换为整型,也不能与整型进行比较,但bool除外。
    nullptr可隐式转换为任何指针类型,因此使用static_cast的显式转换绝对有效。
abithluo

abithluo2#

我怀疑你对 * 空指针 * 和nullptr之间的区别感到困惑,它们是不一样的。
此函数返回nullptr

std::nullptr_t getNullPtr() { return nullptr; }

但是,返回这种类型的对象是非常无用的,很少有好的理由返回这种类型的对象。
此函数返回空指针:

A* getAPtr() { return nullptr; }

返回值用nullptr初始化,但它实际上是A*类型的空指针,而不是nullptr本身。
对于第一个函数,是的,您可以将返回的std::nullptr_t转换为另一个指针类型(您甚至不需要进行转换,它将隐式地发生),但这可能不是您想要做的事情。
对于第二个函数,您不需要强制转换它,因为它已经返回了正确的类型。

mm5n2pyu

mm5n2pyu3#

这只是对目前给出的答案的补充,但对你的问题进行了一点概括(关于返回值的转换,请参见其他答案):显式转换nullptr不仅是有效的,在某些情况下甚至是不可避免的!例如,如果有几个重载函数,每个函数都接受不同的指针类型,并且您需要(无论出于什么原因)使用nullptr调用其中一个函数...

void f(int*) { /*...*/ }
void f(double*) { /*...*/ }
void g()
{
    f(nullptr); // compilation error, ambiguous call!
    f(static_cast<int*>(nullptr)); // now compiler knows...
}

实际上,您也可以使用f

static_cast<void(int*)>(f)(nullptr);

哪一个更好?选择你。

yhuiod9q

yhuiod9q4#

是的,你可以这样做。它仍然是空的,所以调用访问它的成员或数据是不安全的,但是你可以在编译时询问关于它的结构的问题。
例如,这是<cstddef>中的possible implementation of the offsetof(type, member) function,其中nullptr会转换为有效的型别:

#define offsetof(type,member) ((std::size_t) &((static_cast<type*>(nullptr))->member))

相关问题