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

时间:2015-11-11 14:26:58

标签: c++ c++11

我可以这样做吗?

static_cast<A*>(getSomePtr());

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

4 个答案:

答案 0 :(得分:15)

来自Wikipedia article

  

...空指针常量:nullptr。它是类型   nullptr_t,可隐式兑换,可与任何人比较   指针类型或指向成员的类型。这不是含蓄的   可转换或与整数类型相当,但bool除外。

nullptr可隐式转换为任何指针类型,因此static_cast的显式转换绝对有效。

答案 1 :(得分:6)

我怀疑你对空指针nullptr之间的区别感到困惑,它们不一样。

此函数返回nullptr

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

但返回时这是一件非常无用的事情,很少有理由返回该类型的对象。

此函数返回空指针:

A* getAPtr() { return nullptr; }

返回值是使用nullptr初始化的,但它实际上是A*类型的空指针,而不是nullptr本身。

对于第一个函数,是的,你可以将返回的std::nullptr_t转换为另一个指针类型(你甚至不需要演员来进行转换,它会隐式发生)但是那个&#39;可能不是你想做的事。

对于第二个功能,你不需要施放它,因为它已经返回了正确的类型。

答案 2 :(得分:1)

只是对目前为止给出的答案的补充,但稍微概括了一下你的问题(关于返回值的转换,请参阅其他答案):明确地转换nullptr不仅有效,还有一些情况哪里甚至是不可避免的!例如,如果有多个重载函数,每个函数都接受不同的指针类型,你需要(无论出于什么原因)用nullptr调用其中一个......

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

答案 3 :(得分:0)

是的,你可以这样做。它仍然是null,因此调用访问其成员或数据是不安全的,但您可以在编译时询问有关其结构的问题。

例如,这是<cstddef>中的possible implementation of the offsetof(type, member) function,其中nullptr被强制转换为有效类型:

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