非常量左值引用和临时绑定
在 C 中,非常量左值引用应该绑定到相同或相同的左值派生类型。但是,某些情况(例如绑定到临时对象)可能会导致错误。
为什么以下代码有效?
int a; const double &m = a;
在这种情况下,引用绑定到左值,并且由于引用是 const,因此无法修改左值。只要类型兼容,这在 C 中是允许的。
但是,当尝试将非常量左值引用绑定到不同类型的左值时,会发生错误:
int a; double &m = a;
错误:对类型“double”的非常量左值引用无法绑定到不相关类型“int”的值
引发此错误是因为暂时涉及。从 int 到 double 的隐式类型转换会创建一个临时对象。非常量引用不能绑定到临时对象,因为它们要求对象具有已知的生命周期和位置。就其本质而言,临时对象的存在时间有限。
由于编译器扩展允许在某些情况下绑定到临时对象,因此 Visual Studio 可以编译此代码而不会出现错误。但是,像 GCC 这样的编译器会正确标记此错误。
下面的示例演示了用户定义类型的类似问题:
struct Foo {}; Foo &obj = Foo(); // error: binding non-const reference to temporary
理解这个概念对于在 C 中正确处理引用至关重要并避免与对象生命周期相关的运行时问题。
以上是为什么非常量左值引用不能绑定到 C 中的临时变量?的详细内容。更多信息请关注PHP中文网其他相关文章!