延长临时对象的寿命

时间:2015-10-14 14:17:15

标签: c++ reference

任何人都可以告诉我为什么visual studio c ++编译器不允许我这样做:

string& s = "abc";

但我可以这样做:

string& s = string("abc");

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

1 个答案:

答案 0 :(得分:4)

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

正确的代码:

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

如您所见,当您正确使用const引用时,两个版本都可以正常工作。至于虽然MSVC允许一个不正确的版本,并且不允许另一个 - 这只是一个bug,并且问'为什么bug以某种方式行为'是相当没有实际意义的。

但是,如果你必须推理错误:),那么允许int& i = 5允许你编写类似i = 10;的内容,有效地改变整个程序中的5个含义。