我的代码无法编译。
int foobar()
{
// code
return 5;
}
int main()
{
int &p = foobar(); // error
// code
const int& x = foobar(); //compiles
}
为什么添加关键字 const 会使代码编译?
答案 0 :(得分:9)
在C ++中,临时数不能绑定到非常量引用。
在
int &p = foobar();
rvalue表达式foobar()
生成一个不能绑定到p
的临时表,因为它是非const引用。
const int &x = foobar();
将临时值附加到x
这是对const的引用会延长其生命周期。这是完全合法的。
答案 1 :(得分:4)
因为foobar()
按值返回 ;这个结果是暂时的。你不能拥有临时的非常量引用。
如果不是这样,那么这段代码会做什么?
int &x = foobar();
x = 1; // Where are we writing to?
答案 2 :(得分:2)
正如其他人所说,你可以采用const而不是非const引用临时。
在实践中,允许非常规引用临时工具会有危险:
#include <iostream>
void foo(int &i) {
i = 5;
}
int main() {
long l = 4;
foo(l);
std::cout << l << "\n";
}
现在,l
可以隐式转换为int
,因此如果允许对此进行非const的临时引用,则可能会传递foo
对结果的引用转化,与foo
取const int &
时实际相同。分配将对临时进行,然后在临时销毁时丢弃。这可能是一个混乱的错误,而不是预期的结果。
我不知道是否有一套简洁的规则允许在某些情况下非临时引用临时数,但不允许在危险/恼人的情况下引用临时数,但即使如此,C ++标准也不包括它们。请注意,C ++ 0x具有右值引用,这允许您使用在C ++ 03中无法完成的临时值来做一些额外的事情。