web-dev-qa-db-ja.com

(void *)1の意味?

[〜#〜] 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が可能であることを意味しますか?これは何を意味するのでしょうか?

45
Yves

これは、boolコンテキスト変換がC++ 11で導入される前からの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(); }
68
Miles Budnek