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

时间:2013-04-19 16:17:31

标签: 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;
}

正如您所看到的,如果不在之前进行转换,则为参考y指定6不起作用。我可以在X类的定义中添加一些东西,使其在没有强制转换的情况下工作,这样非工作线就能工作吗?

基本上我想实现这一点,例如像这样的函数:

void doSomething(X& x){
    //...
}

之后可以这样调用:

doSomething(7);

有可能吗?

1 个答案:

答案 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类型的临时文件。