C ++中转换运算符之间的优先级

时间:2012-07-13 07:29:11

标签: c++

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

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一样。目前,这种设计已被打破。

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

2 个答案:

答案 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限定的绑定。