繁体   English   中英

(void *)1是什么意思?

[英]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 boolboost::shared_ptr<Impl> ,而Impl::isValid返回bool 没有理由使用,或者在任何地方返回bool

基本上,这是一种扭曲的(并且可能是危险的)书写方式:

return impl_ && impl_->isValid();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM