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


考虑一种类型 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;
}

3440
2017-12-02 01:27


起源



答案:


C ++11§12.3.2

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


9
2017-12-02 03:15



看起来编译器可以在此处发出有用的警告。 - Matthieu M.
谢谢。知道为什么我可以永远使用它来定义这些功能吗? - Jared Hoberock


答案:


C ++11§12.3.2

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


9
2017-12-02 03:15



看起来编译器可以在此处发出有用的警告。 - Matthieu M.
谢谢。知道为什么我可以永远使用它来定义这些功能吗? - Jared Hoberock


允许您从类型到自身定义转换函数但从不使用转换函数的功能在模板编程中可能是一个有用的功能,其中两个类型参数可能会或可能不会引用相同的类型,具体取决于在实例化。我的一些代码依赖于此功能。它节省了必须为两个或多个类型参数最终引用相同类型的情况提供特化。


2
2018-02-02 16:05





我看不出有什么理由会被召唤出来。转换函数被称为...转换。如果您已经拥有正确的类型,则绝对没有理由在复制之前添加转换操作。


1
2017-12-02 03:10



也许: struct T { operator T&() const; }; T ct = T(), &r1 = ct, &r2 = T(); - curiousguy


只是为了记录。我设法在一个更大的软件项目中创建这种结构,盲目地信任编译器警告并删除了“从未使用过的方法”。好吧,我想我发现了一个实际调用它的场景。编译器似乎错过了基类。

#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;
}

0
2018-02-05 09:50