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