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

Pointer to rvalue object member variable

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

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

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

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

虽然 integer{4} 是一个右值,但您称 ref() 为 returns 一个始终为左值的 int&。这允许代码编译,但是你有未定义的行为,因为你取消引用指向不再存在的对象的指针。

要解决此问题,您可以为 ref 提供 ref-qualifer,它只允许在左值上调用它。那看起来像

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

并且如果您尝试使用

将导致编译器错误
integer{4}.ref()

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