ポインターを予期する関数のパラメーター解決中に、ポインター変換ではなく参照からポインターへの変換が選択されるのはなぜですか?
template<typename T>
class resource_ptr
{
public:
operator T*()const {...} // <- C1: Convert to raw pointer for observation.
operator T*&() {...} // <- C2: Convert to reference to pointer, for assignment.
...
};
...
void AcquireResource(resource_class *&); // Assigns to the given pointer.
void UseResource(resource_class *);
...
resource_ptr<resource_class> rpResource;
AcquireResource(rpResource); // <- Calls C2, as expected.
UseResource(rpResource); // <- Calls C2. C1 would have been nice.
UseResource((resource_class*)rpResource); // <- Still calls C2. ???
この特定の設計では、C2 が書き込みアクセスを許可しているため、リソース リークを防ぐために、リソース ポインターが現在割り当てられていないことをアサートすることに注意してください。そのため、C2 は、実際に参照によってポインターが必要な場合にのみ使用することが重要です。たとえば、ポインターを割り当てる API に渡す場合などです。現状では、このデザインは壊れています。
(これらの変換は明示的な関数に置き換えることができますが、この問題を理解したいと思います。)