延长临时对象的使用寿命 可以告诉我为什么VisualStudioC++编译器不允许我这样做: string& s = "abc";
但我可以做到:延长临时对象的使用寿命 可以告诉我为什么VisualStudioC++编译器不允许我这样做: string& s = "abc";,c++,reference,C++,Reference,但我可以做到: string& s = string("abc"); 当我试图在linux上编译第二个示例时,g++编译器实际上抛出了一个错误,这正是我所期望的。快速谷歌搜索告诉我,在第二种情况下,临时变量的寿命延长到引用的寿命,但是,第一个例子有什么问题,为什么g++会对此抱怨?原因很简单。MSVC是有缺陷的。众所周知的bug(他们更喜欢称之为特性)允许inti&=int(5)编译。不应该 正确的代码: int main() { const int& i = 5; c
string& s = string("abc");
当我试图在linux上编译第二个示例时,g++编译器实际上抛出了一个错误,这正是我所期望的。快速谷歌搜索告诉我,在第二种情况下,临时变量的寿命延长到引用的寿命,但是,第一个例子有什么问题,为什么g++会对此抱怨?原因很简单。MSVC是有缺陷的。众所周知的bug(他们更喜欢称之为特性)允许
inti&=int(5)代码>编译。不应该
正确的代码:
int main() {
const int& i = 5;
const int& j = int(5);
}
如您所见,当您正确使用const reference时,这两个版本都可以很好地工作。至于MSVC允许一个不正确的版本,不允许另一个——这只是一个bug,问“为什么bug会以某种方式运行”是没有意义的
然而,如果您必须解释bug:),允许int&i=5
将允许您稍后编写类似i=10代码>有效地改变5在整个程序中的含义 inti&
没有意义。您是否有int&i
?您只能使用常量引用来执行此操作。这与能够将常量引用带到临时引用有关——如果不存在,您将很容易获得悬空引用。对于非常量引用,它是无效的(因为该参数不适用)。当然,您的编译器可能会出现错误。@NathanOliver您是对的,非常抱歉,我最初是在字符串上测试它,然后将它改为int,在我的代码和帖子中都犯了错误:/I编辑了这个问题。现在可能更有意义了。inti&=int(5)代码>不使用MSVS编译。我不认为VC++团队将其视为“bug”。。这是一个VC++扩展。使用移动语义-这是冗余的,但在C++11之前,这是非常方便的optimization@NathanOliver陛下有趣。为什么OP说它可以编译?:)@大卫哈姆,我知道他们叫它什么。这仍然是一个错误。@SergeyA我相信他们有输入错误,但他们没有回应。当我在MSVS中运行代码时,它是一个编译器错误。如果他们有int&i
,则问题应作为