初始化初始化列表中的引用

sky*_*oor 5 c++

我被告知必须在初始化列表中初始化引用变量,但为什么这是错误的?

   class Foo
    {
    public: 
        Foo():x(0) {      
         y = 1;
        }
    private:
        int& x;
        int y;
    };
Run Code Online (Sandbox Code Playgroud)

因为0是临时对象?如果是这样,可以引用什么样的对象?可以拿地址的对象?

谢谢!

GMa*_*ckG 15

0不是左值,它是右值.您无法修改它,但您尝试绑定到可以修改它的引用.

如果您参考const,它将按预期工作.考虑一下:

int& x = 0;
x = 1; // wtf :(
Run Code Online (Sandbox Code Playgroud)

这显然是不行的.但是const&可以绑定临时(rvalues):

const int& x = 0;
x = 1; // protected :) [won't compile]
Run Code Online (Sandbox Code Playgroud)

请注意,临时的生命周期在构造函数完成时结束.如果您为常量进行静态存储,那么您将是安全的:

class Foo
{
public:
    static const int Zero = 0;

    Foo() : x(Zero) // Zero has storage
    {
        y = 1;
    }
private:
    const int& x;
    int y;
};
Run Code Online (Sandbox Code Playgroud)