gcc中类型的非常量引用的初始化无效,但Visual Studio中没有

invalid initialization of non-const reference of type in gcc but not Visual Studio

本文关键字:Visual Studio 初始化 非常 类型 常量 引用 gcc 无效      更新时间:2023-10-16

我有一些代码,其中IInterface是一个抽象类。

我在写这个

IInterface &q  = InterfaceImpl();

并在Visual Studio 2008中进行了编译,运行良好。然后我把它移植到一个gcc项目中,突然我得到了这个错误:

error: invalid initialization of non-const reference of type 'IInterface&' from a temporary of type 'InterfaceImpl'

当试图找出错误时,我发现了以下线程错误:类型为"int&"的非常量引用的初始化无效从"int"类型的右值,至少现在可以理解出了什么问题。因此,将其更改为:

InterfaceImpl i = InterfaceImpl();
IInterface &q = i;

使其编译:

然而,这两个对象的生存期是相同的,所以我真的不明白为什么gcc不能像MS那样创建一个临时对象。我认为这是由标准定义的?当我看到上面的链接时,我可以理解为什么它对基类型之类的东西没有意义,但为什么在对象的情况下它需要得到一个错误?

我也试过这样做,但后来我得到的错误是IInterface是一个抽象类,不能实例化。

IInterface i = InterfaceImpl();

i应该初始化,而不是实例化。这是否意味着我需要InterfaceImpl中的复制构造函数或赋值运算符来实现这一点,或者我为什么会出现这个错误?

InterfaceImpl()返回一个临时对象(右值(,您不能将其保留在非常数引用中。

然而,当你实例化IInterface i时,我就变成了一个左值,所以你可以把它保持在非常量引用中。

但是,在VS中允许将非常量引用绑定到右值。它已经在thread 中进行了讨论