【发布时间】:2013-05-18 15:59: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'
当我试图找出问题所在时,我发现了这个线程error: invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’ 并且至少现在明白了什么问题了。所以改成这样:
InterfaceImpl i = InterfaceImpl();
IInterface &q = i;
让它编译:
但是,这两个对象的生命周期是相同的,所以我真的不明白为什么 gcc 不能像 MS 那样创建一个临时对象。我假设这是由标准定义的?当我查看上面的链接时,我可以理解为什么像基类型这样的东西没有意义,但为什么它需要在对象的情况下出错?
我也这样尝试过,但是我得到了IInterface是一个抽象类并且不能被实例化的错误。
IInterface i = InterfaceImpl();
i 应该被初始化,而不是实例化。这是否意味着我需要在 InterfaceImpl 中使用复制构造函数或赋值运算符才能完成这项工作,或者为什么会出现此错误?
【问题讨论】:
-
标准规定您只能将临时对象绑定到 const 引用。 MSVC 的行为是非标准的。
-
与您的问题没有直接关系,但仅使用
InterfaceImpl q;怎么样? -
我不想直接使用它,因为这是我项目的简化版本,开发它的这一部分,没有重新编译所有内容的开销,直到我知道它应该如何工作。上面的代码在真正的项目中不会存在这样的,我只是碰巧发现了这个问题。
标签: c++