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关键字,但它们不被认为是运算符重载的情况.
| 归档时间: |
|
| 查看次数: |
657 次 |
| 最近记录: |