1

我想知道 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;
}

如您所见,将 6 分配给引用 y 之前不进行转换是行不通的。我可以在类 X 的定义中添加一些东西来使这个工作没有强制转换,这样非工作线就可以工作了吗?

基本上我想实现这一点,例如这样的功能:

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

之后可以这样调用:

doSomething(7);

可能吗?

4

1 回答 1

9

对 non- 的左值引用const只能绑定到左值。6是纯右值,所以它不能绑定到y. 你在这一行做什么:

X& z = (X)7;

基本上相当于这个:

X& z = X(7);

在右侧,它创建一个临时类型X,然后将其绑定到一个左值引用。在 C++ 中,这是非法的 - 临时变量是右值。您的编译器可能允许这样做(不是很聪明)记录的扩展。

避免编写那种代码。另一方面,这是合法的:

X const& z = 6;

并且临时绑定的生命周期z将延长以匹配z引用本身的生命周期(12.2/5)。所以你应该这样写你的函数:

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

左值引用const 可以绑定到右值(包括临时值)。因此,以下调用是合法的:

doSomething(7)

X它会通过提供构造函数的参数来构造一个临时类型7,然后将函数参数绑定x到该临时。

于 2013-04-19T16:22:23.077 回答