我可以这样做吗?
static_cast<A*>(getSomePtr());
其中getSomePtr()将返回nullptr。这样可以吗?
getSomePtr()
nullptr
jum4pzuy1#
nullptr_t
bool
static_cast
abithluo2#
我怀疑你对 * 空指针 * 和nullptr之间的区别感到困惑,它们是不一样的。此函数返回nullptr:
std::nullptr_t getNullPtr() { return nullptr; }
但是,返回这种类型的对象是非常无用的,很少有好的理由返回这种类型的对象。此函数返回空指针:
A* getAPtr() { return nullptr; }
返回值用nullptr初始化,但它实际上是A*类型的空指针,而不是nullptr本身。对于第一个函数,是的,您可以将返回的std::nullptr_t转换为另一个指针类型(您甚至不需要进行转换,它将隐式地发生),但这可能不是您想要做的事情。对于第二个函数,您不需要强制转换它,因为它已经返回了正确的类型。
A*
std::nullptr_t
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:
f
static_cast<void(int*)>(f)(nullptr);
哪一个更好?选择你。
yhuiod9q4#
是的,你可以这样做。它仍然是空的,所以调用访问它的成员或数据是不安全的,但是你可以在编译时询问关于它的结构的问题。例如,这是<cstddef>中的possible implementation of the offsetof(type, member) function,其中nullptr会转换为有效的型别:
<cstddef>
offsetof(type, member)
#define offsetof(type,member) ((std::size_t) &((static_cast<type*>(nullptr))->member))
4条答案
按热度按时间jum4pzuy1#
...空指针常量:
nullptr
。它属于nullptr_t
类型,可以隐式转换为任何指针类型或指向成员的指针类型,也可以与任何指针类型或指向成员的指针类型进行比较。它不能隐式转换为整型,也不能与整型进行比较,但bool
除外。nullptr
可隐式转换为任何指针类型,因此使用static_cast
的显式转换绝对有效。abithluo2#
我怀疑你对 * 空指针 * 和
nullptr
之间的区别感到困惑,它们是不一样的。此函数返回
nullptr
:但是,返回这种类型的对象是非常无用的,很少有好的理由返回这种类型的对象。
此函数返回空指针:
返回值用
nullptr
初始化,但它实际上是A*
类型的空指针,而不是nullptr
本身。对于第一个函数,是的,您可以将返回的
std::nullptr_t
转换为另一个指针类型(您甚至不需要进行转换,它将隐式地发生),但这可能不是您想要做的事情。对于第二个函数,您不需要强制转换它,因为它已经返回了正确的类型。
mm5n2pyu3#
这只是对目前给出的答案的补充,但对你的问题进行了一点概括(关于返回值的转换,请参见其他答案):显式转换
nullptr
不仅是有效的,在某些情况下甚至是不可避免的!例如,如果有几个重载函数,每个函数都接受不同的指针类型,并且您需要(无论出于什么原因)使用nullptr
调用其中一个函数...实际上,您也可以使用
f
:哪一个更好?选择你。
yhuiod9q4#
是的,你可以这样做。它仍然是空的,所以调用访问它的成员或数据是不安全的,但是你可以在编译时询问关于它的结构的问题。
例如,这是
<cstddef>
中的possible implementation of theoffsetof(type, member)
function,其中nullptr会转换为有效的型别: