Pat*_*ick 6 dynamic-cast nullptr c++11
我想查看dynamic_cast的结果.在c ++ 11(或c ++ 0x,对于支持nullptr的编译器),我应该与nullptr或0进行比较吗?
这有关系,如果是的话,为什么?
结果是编译器依赖的吗?
Ken*_*nde 11
常量nullptr(类型nullptr_t)和常量0都将隐式转换为任何指针类型的空值.因此,与任何一个进行比较都会起作用并且在技术上是可行 顺便说一句,这意味着dynamic_cast既不返回一个,它返回特定指针类型的空值.
最好养成使用nullptr而不是使用的习惯0.据我所知,只有正确的重载解决方案才真正有必要(例如一次重载int和另一次重载char*).为了保持一致性,避免0将是最好的.
"指针类型的空值"是什么意思?
考虑一个变量char * ptr.它的类型是(不出所料)char *.但类型nullptr是特殊类型nullptr_t.因此,当我们写出类似的ptr = nullptr东西时,必须发生一些技术性事情
nullptr必须隐式转换为char *.ptr.为空值char *是转换的结果nullptr来char *.从概念上讲,它仍然是nullptr,但具有不同的类型(char *).这个空值是从空值不同int *或string *或任何其它指针类型.我们倾向于将这些空值视为公正nullptr(或0),但每个值实际上是来自不同类型的不同值.(顺便说一下,使用相同的转换进行比较==).
虽然这听起来像是挑剔的细节,但在重载决策中非常重要:
void foo(char * ptr) { ... }
void foo(int i) { ... }
void foo(nullptr_t ptr) { ... }
int main()
{
foo(0); // Calls void foo(int), since 0 is an int
foo(nullptr); // Calls void foo(nullptr_t), since nullptr is a nullptr_t
foo(new char('c')); // Calls void foo(char *), since new char('c') is a char*
}
Run Code Online (Sandbox Code Playgroud)
或者在分配不相关的空值时:
char * c_ptr = nullptr; // Okay
int * i_ptr1 = nullptr; // Okay
int * i_ptr2 = c_ptr; // COMPILER ERROR HERE
Run Code Online (Sandbox Code Playgroud)
在布尔上下文中评估结果:
Base * p = get();
if (Derived * q = dynamic_cast<Derived *>(p))
{
q->derived_method();
}
else
{
// *p isn't of type Derived
}
Run Code Online (Sandbox Code Playgroud)
(这适用于任何版本的C++.)