Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
延长临时对象的使用寿命 可以告诉我为什么VisualStudioC++编译器不允许我这样做: string& s = "abc";_C++_Reference - Fatal编程技术网

延长临时对象的使用寿命 可以告诉我为什么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
,则问题应作为