我想知道是否有某种方式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;
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,如果不在之前进行转换,则将6分配给引用y是行不通的.我可以在X类的定义中添加一些东西,使其在没有强制转换的情况下工作,这样非工作线就能工作吗?
基本上我想实现它,例如像这样的函数:
void doSomething(X& x){
//...
}
Run Code Online (Sandbox Code Playgroud)
之后可以这样调用:
doSomething(7);
Run Code Online (Sandbox Code Playgroud)
可能吗?
对非值的左值引用const只能绑定到左值.6是一个prvalue,所以它无法绑定y.你在这方面做了什么:
X& z = (X)7;
Run Code Online (Sandbox Code Playgroud)
基本上相当于这个:
X& z = X(7);
Run Code Online (Sandbox Code Playgroud)
在右侧,它创建一个临时类型X,然后将其绑定到左值引用.在C++中,这是非法的 - 临时值是rvalues.您的编译器可能允许这样做(不是非常聪明)记录的扩展.
避免编写那种代码.另一方面,这是合法的:
X const& z = 6;
Run Code Online (Sandbox Code Playgroud)
并且临时绑定的生命周期z将延长以匹配z引用本身的生命周期(12.2/5).所以你应该这样编写你的函数:
void doSomething(X const& x)
// ^^^^^
{
//...
}
Run Code Online (Sandbox Code Playgroud)
左值引用const 可以绑定到右值(包括临时值).因此,以下调用是合法的:
doSomething(7)
Run Code Online (Sandbox Code Playgroud)
并且它将X通过提供7构造函数的参数x来构造临时类型,然后将函数参数绑定到该临时.