[英]What does (void *)1 mean?
我正在阅读ROS的代码。
在文件ros_comm/roscpp/include/ros/subscriber.h
,我看到这样的一段代码:
operator void*() const { return (impl_ && impl_->isValid()) ? (void*)1 : (void*)0; }
好吧, (void *)0
在C语言中可以视为NULL
,但是(void *)1
是什么意思?
如果Foo
类包含此函数,则意味着我们可以这样编写代码:
Foo foo;
void *ptr = foo;
对? 那么这是否意味着void *ptr = (void *)1
是可能的? 这是什么意思?
这是避免在C ++ 11中引入explicit
上下文转换之前从bool
进行隐式转换的问题的老技巧。 它旨在用于检查有效性:
Subscriber my_subscriber = someFunction();
if (!my_subscriber) {
// error case
}
重要的一点是,不存在从void*
到整数类型的内置转换,但是确实存在从bool
到整数类型的转换。 同时,存在从void*
到bool
的内置转换。 这意味着,如果您定义了对bool
的隐式转换,则以下内容令人惊讶地有效:
void my_func(int i);
void another_func() {
Subscriber sub = something();
my_func(sub);
}
将转换定义为void*
可避免该问题。
如今,这种技巧已经过时了。 C ++ 11引入了explicit
转换。 在if
和loop的条件下考虑对bool
explicit
转换,但在其他有问题的情况下则不考虑。 这意味着这些天的转换应写为:
explicit operator bool() const { return impl_ && impl_->isValid(); }
它表明,编写代码的人对他们使用的语言或工具不是很熟悉,或者代码已经存在了很长时间,并且被不同的人破解,大概是经过在过去的某个时间从C到C ++的过渡,仍然带有一些旧的API合同(预期为void*
),可能难以更改。
如果您查看源代码,则没有充分的理由这样做。 impl_
是实现operator bool
的boost::shared_ptr<Impl>
,而Impl::isValid
返回bool
。 没有理由使用,或者在任何地方返回bool
。
基本上,这是一种扭曲的(并且可能是危险的)书写方式:
return impl_ && impl_->isValid();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.