我正在阅读ROS的代码。
在文件中ros_comm/roscpp/include/ros/subscriber.h
,我看到了这样的一段代码:
operator void*() const { return (impl_ && impl_->isValid()) ? (void*)1 : (void*)0; }
好吧,(void *)0
可以看作是NULL
C语言,但这是什么(void *)1
意思呢?
如果一个类Foo
包含此函数,则意味着我们可以这样编写代码:
Foo foo;
void *ptr = foo;
对?那么这是否意味着void *ptr = (void *)1
可能?这是什么意思?
这是避免在C ++ 11中引入上下文转换bool
之前隐式转换到from的问题的老技巧explicit
。它旨在用于检查有效性:
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
转换。在和循环的条件下考虑到的explicit
转换,但在其他有问题的情况下则不考虑转换。这意味着这些天的转换应写为:bool
if
explicit operator bool() const { return impl_ && impl_->isValid(); }
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句