鉴于
void foo( int&& x ) {
std::cout << &x;
}
这可行,但这个地址实际上代表什么?调用foo时是否创建了临时int
,这是地址所代表的内容?如果这是真的并且如果我写int y = 5; foo(static_cast<int&&>(y));
,这是否会导致创建另一个临时或编译器是否会智能地引用y?
答案 0 :(得分:7)
当你获取一个右值引用的地址时,它返回一个指向引用绑定的对象的指针,就像左值引用一样。该对象可以是临时的或不是临时的(例如,您可以像在代码中一样将左值转换为右值引用)。
int y = 5; foo(static_cast<int&&>(y));
不会创建临时的。此转换在标准的5.2.9/3
部分中进行了描述:
如果“
cv1 T1
”与“cv2 T2
”引用兼容,则可以强制使用类型为“cv2 T2
”的glvalue,类prvalue或数组prvalue来键入“对cv1 T1
的右值引用”foo(1);
”。
例如,如果您拨打{{1}},则会创建临时。