【问题标题】:Extending the lifespan of temporary object [duplicate]延长临时对象的寿命[重复]
【发布时间】:2016-01-12 16:33:17
【问题描述】:

谁能告诉我为什么 Visual Studio C++ 编译器不允许我这样做:

string& s = "abc";

但我可以做到:

string& s = string("abc");

当我尝试在 linux 上编译第二个示例时,g++ 编译器实际上抛出了一个错误,这正是我所期望的。谷歌快速搜索告诉我,在第二种情况下,临时变量的寿命延长到引用的寿命,但话说回来,第一个例子有什么问题,为什么 g++ 抱怨它?

【问题讨论】:

  • int i& 没有意义。你有int &i吗?
  • 您只能使用 const 引用来执行此操作。这与能够对临时对象进行 const 引用有关 - 如果这不存在,您将很容易获得悬空引用。对于非常量引用,它是无效的(因为该参数不适用)。当然,您的编译器可以随意出问题。
  • @NathanOliver 你是对的,我很抱歉,我最初是在字符串上测试它并将其更改为整数,在我的代码和帖子中都出错:/我编辑了这个问题。现在可能会更有意义。

标签: c++ reference


【解决方案1】:

这有一个简单的原因。 MSVC 有问题。众所周知的错误(他们更喜欢称之为功能)允许 int i& = int(5); 编译。不应该。

正确的代码:

int main() {
  const int& i = 5;
  const int& j = int(5);
}

如您所见,当您正确使用 const 引用时,两个版本都可以正常工作。至于 MSVC 允许一个不正确的版本,而不允许另一个 - 这只是一个错误,并且询问“为什么该错误以某种方式表现”是相当没有意义的。

但是,如果您必须对错误进行推理 :),允许 int& i = 5 稍后将允许您编写类似 i = 10; 的内容,从而有效地改变 5 在整个程序中的含义。

【讨论】:

  • int i& = int(5); 不能用 MSVS 编译
  • 我不认为 VC++ 团队将其视为“错误”.. 它是 VC++ 扩展。带有移动语义 - 它是多余的,但在 C++11 之前,这是非常方便的优化
  • @NathanOliver,嗯...有趣。为什么OP说它可以编译? :)
  • @DavidHaim,我知道他们怎么称呼它。它仍然是一个错误。
  • @SergeyA 我相信他们有错字,但他们没有回复。当我在 MSVS 中运行代码时,这是一个编译器错误。如果他们有int &i,那么问题应该作为stackoverflow.com/questions/16380966/…的副本关闭
猜你喜欢
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
  • 2021-02-05
相关资源
最近更新 更多