c ++ - 有没有办法在将值分配给引用时自动转换值?

Van*_*ing 1 c++

我想知道是否有某种方式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)

可能吗?

And*_*owl 9

对非值的左值引用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来构造临时类型,然后将函数参数绑定到该临时.