我可以这样做吗?
static_cast<A*>(getSomePtr());
getSomePtr()
将返回nullptr
。这可以吗?
答案 0 :(得分:15)
...空指针常量:
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))