在期望指针的函数的参数解析期间,为什么选择引用指针转换而不是指针转换?
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一样。目前,这种设计已被打破。
(这些转换可以用显式函数替换,但我想了解这个问题。)
答案 0 :(得分:3)
当要转换的对象是const时,使用const
版本。这与普通的成员函数相同。
我会使用命名转换函数,以便更容易阅读。
答案 1 :(得分:0)
您对UseResource
的调用是非类类型(指针类型)的初始化,因此适用以下条款:
8.5初始值设定项[dcl.init]
15 [...] - 否则,如果源类型是(可能是cv-quali fi ed)类类型,则考虑转换函数。 列举了适用的转换函数(13.3.1.5),并通过选择最佳函数 重载决议(13.3)。
是否为参数类型resource_class *
提供显式强制转换无关紧要;演员将初始化从复制初始化更改为直接初始化,但是(按照8.5:13),当目标类型是非类时,区别是无关紧要的类型。
然后,我们分别有两个转换函数,分别是有效参数列表(resource_ptr &)
和(resource_ptr const &)
(对于隐式对象参数); 13.3.3.2:3适用于绑定引用,因此较少cv限定的引用绑定优先于更多cv限定的绑定。