在什么情况下会调用类型的转换运算符?

Under what circumstances would a type's conversion operator to itself be invoked?

本文关键字:转换 运算符 类型 情况下 调用 在什么      更新时间:2023-10-16

考虑一个类型bar,它具有用户定义的到bar类型引用的转换操作符:

struct bar
{
  operator bar & ();
  operator const bar & () const;
};

何时应用这些转换?此外,如果这些算子是deleted又意味着什么呢?这两个特性有什么有趣的用途吗?

下面的程序似乎没有应用这两种转换:

#include <iostream>
struct bar
{
  operator bar & ()
  {
    std::cout << "operator bar &()" << std::endl;
    return *this;
  }
  operator const bar & () const
  {
    std::cout << "operator const bar &() const" << std::endl;
    return *this;
  }
};
void foo(bar x)
{
}
int main()
{
  bar x;
  bar y = x;         // copy, no conversion
  y = x;             // assignment, no conversion
  foo(x);            // copy, no conversion
  y = (bar&)x;       // no output
  y = (const bar&)x; // no output
  return 0;
}

c++ 11§12.3.2

转换函数永远不能用于将(可能限定为cv的)对象转换为(可能限定为cv的)相同对象类型(或对其的引用),转换为该类型的(可能限定为cv的)基类(或对其的引用),或转换为(可能限定为cv的)void

允许定义从类型到自身的转换函数,但从不使用转换函数的特性在模板编程中可能是一个有用的特性,其中两个类型参数可能引用或不引用相同的类型,这取决于实例化。我的一些代码依赖于这个特性。当两个或多个类型参数最终引用同一类型时,可以避免提供特殊化。

我不明白为什么要调用它。转换函数被调用到…转换。如果已经有了正确的类型,则绝对没有理由在复制之前添加转换操作。

提醒一下。我设法在一个更大的软件项目中创建了这种结构,盲目地相信编译器的警告并删除了"从未使用过的方法"。好吧,我想我找到了一个场景,它实际上被称为。编译器似乎忽略了基类。

#include <iostream>
struct D;
struct B
{
    virtual operator D& ()
    {
        throw "foo";
    }
};
struct D : public B
{
    virtual operator D& ()
    {
        std::cout << "bar" << std::endl;
        return *this;
    }
};
int main()
{
    B* b = new D();
    D& d = *b;
    return 0;
}