2015-10-14 65 views
2

谁能告诉我为什么Visual Studio的C++编译器不允许我这样做:延长临时对象的生命周期

string& s = "abc"; 

,但我能做到这一点:

string& s = string("abc"); 

当我试图在linux上编译第二个例子,g ++编译器实际上抛出了一个错误,这正是我所期望的。快速谷歌搜索告诉我,在第二种情况下,临时变量的生命周期扩展到引用的生命周期,但是再一次,第一个例子有什么问题,为什么g ++会抱怨呢?

+3

'int i&'没有意义。你有'int&i'吗? – NathanOliver

+0

你只能用const引用来做到这一点。这与能够对临时引用const引用有关 - 如果这不存在,您将非常容易地引用悬挂引用。对于非const引用,它是无效的(因为该参数不适用)。当然,你的编译器可以自由运行。 – dascandy

+0

@NathanOliver你是对的,我非常抱歉,我最初是在字符串上测试它,并将它改为整数,导致我的代码和帖子出错:/我编辑了这个问题。现在可能会更有意义。 – zedsdead

回答

4

有一个简单的原因。 MSVC是越野车。知道的bug(他们更喜欢称为一个功能)允许编译int i& = int(5);。它不应该。

正确的代码:

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

正如你看到的,当你正确使用const引用,这两个版本完全正常工作。至于虽然MSVC允许一个不正确的版本,并且不允许另一个版本 - 这只是一个错误,并且询问'为什么错误以某种方式运行'是相当实际的。

但是,如果您必须对错误:)进行推理,允许int& i = 5稍后允许您编写诸如i = 10;之类的内容,从而有效地改变整个程序中的5意味着什么。

+0

'int i&= int(5);'不能用MSVS编译 – NathanOliver

+0

我不认为VC++团队将它视为“bug”..它是一个VC++扩展。与移动语义 - 它是冗余的,但预C++ 11这是相当方便的优化 –

+0

@NathanOliver,嗯......有趣的。为什么OP说它编译? :) – SergeyA