3

在需要指针的函数的参数解析期间,为什么选择引用到指针的转换而不是指针转换?

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 时。就目前而言,这种设计被打破了。

(这些转换可以用显式函数替换,但我想了解这个问题。)

4

2 回答 2

3

const要转换的对象为 const 时使用版本。这与普通成员函数的工作方式相同。

我会使用命名转换函数,以使其更易于阅读。

于 2012-07-13T07:33:08.377 回答
0

您的调用UseResource是对非类类型(指针类型)的初始化,因此适用以下子句:

8.5 初始化器 [dcl.init]

15 [...] — 否则,如果源类型是(可能是 cv 限定的)类类型,则考虑转换函数。列举了适用的转换函数 (13.3.1.5),并通过重载决议 (13.3) 选择最佳转换函数。

是否为参数类型提供显式转换并不重要resource_class *;强制转换将初始化从复制初始化更改为直接初始化,但是(根据 8.5:13)当目标类型是非类类型时,区别是无关紧要的。

然后我们有两个转换函数,分别具有有效的参数列表(resource_ptr &)(resource_ptr const &)(对于隐式对象参数);13.3.3.2:3 适用于绑定引用,因此 cv 限定的引用绑定优于 cv 限定的绑定。

于 2012-07-13T14:17:25.870 回答