【发布时间】:2022-01-01 08:10:31
【问题描述】:
为什么不允许获取对临时对象的非常量引用,
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
【问题讨论】:
-
我不同意“对象的生命周期不能成为原因”部分,只是因为标准中规定,将临时对象分配给 const 引用会将此对象的生命周期延长到const 引用的生命周期。虽然没有提到非常量引用...
-
好吧,那是什么原因导致“虽然关于非常量引用什么都没说......”。这是我的问题的一部分。这有什么意义吗?可能是标准的作者忘记了非常量引用,很快我们就会看到下一个核心问题?
-
GotW #88:“最重要的 const”的候选人。 herbsutter.spaces.live.com/blog/cns!2D4327CC297151BB!378.entry
-
@Michael:VC 将右值绑定到非常量引用。他们称之为功能,但实际上它是一个错误。 (请注意,这不是一个错误,因为它本质上是不合逻辑的,而是因为它被明确排除以防止愚蠢的错误。)
标签: c++ reference constants temporary c++-faq