【问题标题】:invalid initialization of non-const reference of type in gcc but not Visual Studiogcc 中类型的非常量引用的初始化无效,但 Visual Studio 中的类型引用无效
【发布时间】: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++


【解决方案1】:

InterfaceImpl() 返回一个不能保存在非常量引用中的临时对象(右值)。

但是当你实例化IInterface i时,i 变成了一个左值,所以你可以将它保存在非常量引用中。

然而,在 VS 中允许绑定非常量引用到右值。这个thread已经讨论过了

【讨论】:

  • 创建第二个(无用的)变量只是为了满足这个要求并没有让我很高兴。
  • @Devolus:在你的假例子中,你不需要创建第二个变量,你可以直接使用InterfaceImpl 对象。如果您提供一个真实的例子,也许我们可以为您提供一个您不觉得如此令人反感的选项。
  • 谢谢,但在实际项目中,这个变量无论如何都是由函数分配的,然后我没有这个问题,所以它只是示例的工件。
猜你喜欢
  • 2015-01-26
  • 2013-01-07
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多