2017-05-22 35 views
1

我目前正在研究一些看起来很奇怪的第三方C++代码(我从C++ 11开始)。其中一个给我留下了很多东西疑惑,是static_castNULL在许多情况下某些指针类型:在C++中将SomeType *转换为NULL有什么用?

SomeClass* someClassPtr = static_cast<SomeClass*>(NULL); 

我知道你可以施放例如指针从基类指针转换为派生类指针,但这里绝对没有继承。据我所看到的,这已经足够了:

SomeClass* someClassPtr = NULL; 

但在这个代码,其中NULL没有得到浇铸为特定的指针类型的唯一案例,在载体和其他容器指针:

SomeOtherClass.vecOfSomeClassPtr[i] = NULL; 

所以我的问题是:

  • 这是简单的旧式(甚至C-样式)代码之前有nullptr
  • 是否/正在铸造NULL其他事情需要比使用继承时的down/upcasting?
  • 或者我完全错过了什么?

而如果我没有得到它错了到目前为止:
我先被替换的static_cast<type*>(NULL)所有实例NULL后来nullptr,看是否会破坏任何东西:不。 编译器不会抗议,程序似乎仍然按预期工作。 但我知道指针可能会非常棘手的小混蛋,于是:

  • 有关使用nullptr什么陷阱没有我可能会错过?

PS:是的,我确实使用了搜索,是的,我在C代码上找到了类似的问题。 但这是C++代码,我很想知道,而不是仅仅假设某件事。

+2

在一个问题中你有很多问题。 – user2079303

+0

我会牢记未来。 – Floriel

回答

4

在C++中将NULL转换为SomeType *有什么用?

SomeClass* someClassPtr = static_cast<SomeClass*>(NULL); 

演员在这方面没有任何影响。

但更普遍的,它有一定道理在超载涉及一些其他方面:

void stupidly_overloaded_function(int); 
void stupidly_overloaded_function(SomeClass*); 
void stupidly_overloaded_function(SomeOtherClass*); 

stupidly_overloaded_function(NULL); 

哪个函数被调用?它实际上取决于NULL的定义。它可能会调用int重载,或者由于含糊不清导致编译失败。

的铸造制可以消除歧义电话:

stupidly_overloaded_function(static_cast<SomeClass*>(NULL)); 

我觉得这是引入nullptr一个显著的原因。虽然连nullptr不能与多个不同的指针重载处理,但这整数之间的歧义:

void not_quite_as_silly_overload(int); 
void not_quite_as_silly_overload(SomeClass*); 

not_quite_as_silly_overload(NULL); // might call either overload 
not_quite_as_silly_overload(nullptr); // unambiguously calls the pointer overload 

用C另一种情况是涉及对象的大小,如从Linux内核container_of宏宏:

define container_of(ptr, type, member) ({      \ 
     const typeof(((type *)0)->member) *__mptr = (ptr); \ 
     (type *)((char *)__mptr - offsetof(type,member));}) 

这里,仅使用0代替NULL。我想认为这可以用C++实现而不用强制转换,但只能使用在C++ 11中引入的declval


这是简单的旧式(甚至C-样式)代码之前有nullptr?

不,这种多余的演员阵容没有通用的风格。你的例子没有重载,所以上面的情况不适用于它。

在处理继承时,/是否正在将NULL转换为除了向下/向上转换之外的其他内容所必需的NULL?

不,它是(并且仍然是在不同的指针重载情况下)重载解析所必需的。

+0

所以我应该小心地在函数调用中替换这些强制转换,但应该保存在赋值中。 – Floriel

+1

@Floriel在指定相同类型的指针时绝对安全。只要你使用'nullptr',可能对函数调用是安全的。如果超载失败,您会在构建时看到。 – user2079303

相关问题