#include <iostream>
using namespace std;
struct A
{
A(int a):a(a){}
int a;
};
struct B
{
operator A()
{
return 10;
}
};
int main()
{
B b;
cout << ((A)b).a << endl;
return 0;
}
此代码在visual studio中编译并打印10
。但是在强制转换操作符旁边的wikipedia中,我发现了这句话:Note: for user-defined conversions, the return type implicitly and
必然 matches the operator name.
现在上面的代码是如何工作的?这是visual studio的这个功能吗?或者它只是隐含地匹配?
答案 0 :(得分:6)
operator A()
是用户定义的转换运算符。当您将A
投射到B
时,它的作用是返回A
个按值。
您的operator A()
函数返回一个文字整数值10
。但operator A
需要返回A
,因此使用值A
调用10
的转换构造函数。这导致构造临时A
。然后,您正在访问此临时对象上的.a
,并将.a
的值插入到流中,这样您就可以在屏幕上看到10
。
修改
当wiki说转换运算符“隐式”返回A
时,这意味着您不必在函数声明中指定返回类型。它始终是A
,你无能为力。
当wiki说它“必然”返回A
时,它意味着除了A
之外它不会返回任何内容。它甚至无法返回任何可转换为A
的内容。它必须完全返回A
。
答案 1 :(得分:1)
B::operator A()
隐式返回A
。因此,return 10
隐含等同于return (A)10
或return A(10)
。