为什么非Const引用不能绑定到临时对象?为什么不允许获取对临时对象的非Const引用,哪个函数getx()退货?很明显,这是C+标准所禁止的,但我对这种限制的目的感兴趣,不是参考达到标准。struct X{
X& ref() { return *this; }};X getx() { return X();}void g(X & x) {} int f(){
const X& x = getx(); // OK
X& x = getx(); // error
X& x = getx().ref(); // OK
g(getx()); //error
g(getx().ref()); //OK
return 0;}很明显,对象的生存期不能成为原因,因为对象的持续引用是不受禁止C+标准。显然,在上面的示例中,临时对象不是常量,因为允许调用非常量函数。例如,ref()可以修改临时对象。此外,ref()允许您欺骗编译器,并获得到这个临时对象的链接,从而解决我们的问题。此外:他们说“将一个临时对象分配给Const引用延长了该对象的生存期”,并且“尽管没有提到非Const引用”。我的附加问题。之后的赋值是否延长了临时对象的生存期?X& x = getx().ref(); // OK
3 回答
慕标5832272
TA贡献1966条经验 获得超4个赞
getx()
g(getx()); // g() would modify an object without anyone being able to observe
X x1 = getx();const X& x2 = getx(); // extend lifetime of temporary to lifetime of const referenceg(x1); // fineg(x2); // can't bind a const reference to a non-const reference
void g(X&); // #1, takes an ordinary (lvalue) referencevoid g(X&&); // #2, takes an rvalue referenceX x; g(x); // calls #1g(getx()); // calls #2g(X()); // calls #2, too
class X { X(X&& rhs) : pimpl( rhs.pimpl ) // steal rhs' data... { rhs.pimpl = NULL; // ...and leave it empty, but deconstructible } data* pimpl; // you would use a smart ptr, of course};X x(getx()); // x will steal the rvalue's data, leaving the temporary object empty
- 3 回答
- 0 关注
- 951 浏览
添加回答
举报
0/150
提交
取消