我想知道C ++是否有某种方法可以自动转发我想要分配给引用的值。
class X{
public:
X(int x){
}
};
int main(){
X x = 5; //works
X& y = 6; //doesn't work
X& z = (X)7; //works
return 0;
}
正如您所看到的,如果不在之前进行转换,则为参考y指定6不起作用。我可以在X类的定义中添加一些东西,使其在没有强制转换的情况下工作,这样非工作线就能工作吗?
基本上我想实现这一点,例如像这样的函数:
void doSomething(X& x){
//...
}
之后可以这样调用:
doSomething(7);
有可能吗?
答案 0 :(得分:9)
对非const
的左值引用只能绑定到左值。 6
是prvalue,因此无法绑定到y
。你在这方面做了什么:
X& z = (X)7;
基本上相当于:
X& z = X(7);
在右侧,它会创建一个X
类型的临时值,然后将其绑定到左值引用。在C ++中,这是非法的 - 临时值是rvalues。您的编译器可能允许这样做(不是非常聪明)记录的扩展。
避免编写那种代码。另一方面,这是合法的:
X const& z = 6;
z
临时绑定的生命周期将延长,以匹配z
引用本身的生命周期(12.2 / 5)。所以你应该这样写你的函数:
void doSomething(X const& x)
// ^^^^^
{
//...
}
对const
的左值引用可以绑定到右值(包括临时值)。因此,以下调用是合法的:
doSomething(7)
通过提供X
作为构造函数的参数,然后将函数参数7
绑定到该临时值,它将构造一个x
类型的临时文件。