我知道lvalues可以被转换成const引用。我想知道是否可以获得指向这些lvalues的指针。
如果我写
const int* p = &3; //ERROR: lvalue required as unary operand '&'
我收到了这个错误。然而,
const int* p = &((const int&)3);
这个编译是成功的。在这种情况下,*p的结果是否保证为3?
这样会构造一个临时的 int(3)
并将其绑定到const引用上。 p
的指针被指向该临时对象。 临时对象的生命周期被延长以与该引用相匹配 - 但是该引用本身是一个临时对象,并在分号处被销毁,导致 p
成为悬空指针。 任何尝试在此之后使用 p
(除了对其赋新值)都会表现出未定义的行为。
const int& p = (const int&)3; const int* q = &p;
可能值得一提。 - AndyGconst int& p = 3;
。 - Igor Tandetnik
static_cast
可以在不同类型的一对一之间执行各种强制类型转换,包括static_cast<const int&>(3)
这个例子本身就是完全合法的。UB的产生是因为在对象的生命周期结束后尝试使用它,而不是通过强制类型转换创建该对象产生的。 - Igor Tandetnik