union A {
public:
B b;
inline operator B() const {
return b;
}
}
void doSomething(B& b){};
A a;
doSomething(a);
使用类似于上面的代码获取“没有匹配的函数来调用”错误。你不能用这种方式来引用吗?
解决?
答案 0 :(得分:2)
在调用doSomething(a)
中,a
使用转换运算符(按值返回,因此返回新的临时对象)转换为B
类型的右值。
由于rvalues只能用作非const引用或值参数,因此您无法使用rvalue调用doSomething
。
声明doSomething
通过const引用,值或rvalue-reference获取其参数。如果合适,您还可以operator B
返回对b
成员的引用。
答案 1 :(得分:1)
强制转换操作符按值返回b
,并且在调用doSomething
函数时使用该结果将创建临时值,并且由于它们的临时性,你根本无法引用临时值。
更改doSomething
以按值接收其参数,或者通过 const
引用(可以绑定到临时值),或者可能是rvalue-reference(使用参数声明中的&&
语法),或者当然是一个返回引用的强制转换操作符。