指向右值对象成员变量的指针

Den*_*cor 4 c++ pointers rvalue

这是一个非常快速的问题。我有以下代码:

struct integer {
    int x;
    int& ref() {
        return x;
    }
};

//main...
int* l = &integer{4}.ref();
std::cout << *l;
Run Code Online (Sandbox Code Playgroud)

我的问题是:&integer{4}.ref()因为它是一个临时对象,所以它不是一个右值吗?我怎么能有一个指向它的指针?这是未定义的行为吗?

Nat*_*ica 5

Whileinteger{4}是一个右值,你调用ref()它返回一个int&始终是一个左值的。这允许代码编译,但由于您取消引用指向不再存在的对象的指针,因此您具有未定义的行为。

为了解决这个问题,你可以提供一个参考,限定符ref只允许它在左值调用。那看起来像

struct integer {
    int x;
    int& ref() & {
        return x;
    }
};
Run Code Online (Sandbox Code Playgroud)

如果您尝试使用,将导致编译器错误

integer{4}.ref()
Run Code Online (Sandbox Code Playgroud)

因为integer{4}不是ref现在需要的左值。