簡體   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