(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 中引入上下文转换之前隐式转换为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
转换为bool
在if
和循环的条件下考虑,但在其他有问题的情况下不考虑。 这意味着现在转换应该写成:
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();
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- "类模板示例<int>;"语句对 C++11 是什么意思?
- 线应该是什么意思
- "CID"在AT+HTTPPARA= "CID" ,1中是什么意思
- 表达式"b=(b-x)&x"是什么意思?
- 这个表达是什么意思?
- 此代码验证公式是什么意思?
- 跟踪日志中的T.11803()是什么意思?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- * 和 ** 在 C++ 函数声明中是什么意思?
- _T("xyz")是什么意思?
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 这行代码到底是什么意思?
- 在命名空间名称之前加上 :: 是什么意思?
- 从字符数组的元素中减去'a'是什么意思
- "friend"关键字在C++中是什么意思?
- 减法中的"0"是什么意思?
- 字符数组前面的加号是什么意思?
- 这里的字符串函数是什么意思