在需要指针的函数的参数解析期间,为什么选择引用到指针的转换而不是指针转换?
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 时。就目前而言,这种设计被打破了。
(这些转换可以用显式函数替换,但我想了解这个问题。)