Yve*_*ves 45 c++ casting type-conversion typecasting-operator ros
我正在阅读ROS的代码。
在文件中ros_comm/roscpp/include/ros/subscriber.h,我看到了这样的一段代码:
operator void*() const { return (impl_ && impl_->isValid()) ? (void*)1 : (void*)0; }
Run Code Online (Sandbox Code Playgroud)
好吧,(void *)0可以看作是NULLC语言,但这(void *)1意味着什么呢?
如果一个类Foo包含此函数,则意味着我们可以这样编写代码:
Foo foo;
void *ptr = foo;
Run Code Online (Sandbox Code Playgroud)
对?那么这是否意味着void *ptr = (void *)1可能?这是什么意思?
Mil*_*nek 67
这是避免在C ++ 11中引入上下文转换bool之前隐式转换到from的问题的老技巧explicit。它旨在用于检查有效性:
Subscriber my_subscriber = someFunction();
if (!my_subscriber) {
// error case
}
Run Code Online (Sandbox Code Playgroud)
重要的一点是,不存在从void*到整数类型的内置转换,但是确实存在从bool到整数类型的转换。同时void*,bool存在从到的内置转换。这意味着,如果您定义了对的隐式转换bool,那么以下内容将非常有效:
void my_func(int i);
void another_func() {
Subscriber sub = something();
my_func(sub);
}
Run Code Online (Sandbox Code Playgroud)
定义转换可void*避免该问题。
如今,这种技巧已经过时了。C ++ 11引入了explicit转换。 在和循环的条件下考虑到的explicit转换,但在其他有问题的情况下则不考虑转换。这意味着这些天的转换应写为:boolif
explicit operator bool() const { return impl_ && impl_->isValid(); }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3891 次 |
| 最近记录: |