[英]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 bool
的boost::shared_ptr<Impl>
,而Impl::isValid
返回bool
。 沒有理由使用,或者在任何地方返回bool
。
基本上,這是一種扭曲的(並且可能是危險的)書寫方式:
return impl_ && impl_->isValid();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.