这是构造函数运算符还是转换运算符?

dee*_*ive 13 c++

class B
{
    public:
        operator B() const{ }    // What is this and what is the purpose?

    private:
        int m_i;
};
Run Code Online (Sandbox Code Playgroud)

所以问题是,转换运算符或构造函数运算符是什么用的呢?在哪里使用它?

Pot*_*ter 13

它是一个永远不会被隐式调用的转换函数.该标准实际上深入探讨了这个问题.12.3.2/1:

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

在脚注中,

这些转换被视为标准转换,用于重载解析(13.3.3.1,13.3.3.1.4),因此初始化(8.5)和显式转换(5.2.9).转换为void不会调用任何转换函数(5.2.9).即使从未直接调用执行转换,也可以声明此类转换函数,并且可以通过调用基类中的虚拟转换函数来实现.

此外,转换函数仍然是正常函数,可以通过名称显式调用.

关于虚函数的注释适用于这样的代码:

class B;

struct A {
    virtual operator B() const = 0;
};

struct B : A
{
    public:
        operator B() const{ return B(); } // virtual override

    private:
        int m_i;
};

A const & q = B(); // q has dynamic type B, static type A
B r = q; // Convert A to B using B::operator B()
Run Code Online (Sandbox Code Playgroud)

迂腐:"转换运算符"是一个很差的术语.这些被称为转换函数,尽管有operator关键字,但它们不被认为是运算符重载的情况.