这是一个非常快速的问题。我有以下代码:
struct integer {
int x;
int& ref() {
return x;
}
};
//main...
int* l = &integer{4}.ref();
std::cout << *l;
我的问题是:&integer{4}.ref()
不是右值,因为它是一个临时对象?我怎么有指向它的指针?这是未定义的行为吗?
integer{4}
是一个右值时,您调用ref()
会返回一个始终为左值的int&
。这允许代码进行编译,但是由于您拥有一个指向不再存在的对象的指针,因此您具有未定义的行为。
要解决此问题,您可以为ref
提供ref-qualifer,仅允许在类似[]的左值上调用它>]
struct integer {
int x;
int& ref() & {
return x;
}
};