(void *)1 是什么意思

What does (void *)1 mean?

本文关键字:是什么 意思 void      更新时间:2023-10-16

我正在阅读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 中引入上下文转换之前隐式转换为bool的问题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转换为boolif和循环的条件下考虑,但在其他有问题的情况下不考虑。 这意味着现在转换应该写成:

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();