允许非常量引用绑定到右值:VS2010 异常
C 标准严格禁止将非常量引用绑定到右值。然而,在一个特殊的异常情况下,Visual Studio 2010 (SP1) 编译以下代码时没有任何错误或警告:
string foo() { return "hello"; }
int main() {
string& tem = foo(); // Non-const reference to rvalue
}
编译器行为差异
相比之下,其他编译器表现出更严格的行为:
VS2010 异常解释
VS2010 中的这种异常行为源于已知的编译器扩展。与 GCC 和 Visual Studio 2008 不同,VS2010 在某些情况下允许将非常量引用绑定到右值,例如当右值由返回临时对象的函数生成时。
虽然此扩展违反了标准,它可能是为了方便而实施的。但是,如果在绑定引用后修改右值,则可能会导致未定义的行为。
后果和建议
此扩展可能会在依赖于该扩展的代码中引入微妙的错误正确遵守 C 标准。因此,强烈建议避免将非常量引用绑定到右值,即使在 VS2010 中也是如此。相反,按照标准的预期,在绑定到右值时始终使用 const 引用。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3