每当我运行像
这样的代码时,我都会在visual studio中注意c ++#include "stdafx.h"
#include <iostream>
int &test() {
int num = 19;
return num;
}
int main() {
auto &num = test();
std::cout << num << std::endl;
}
显然不应该工作因为num是测试中的本地对象,但有些是如何在visual studio上编译的。此代码也编译
#include <iostream>
#include <string>
int main()
{
std::string str1 = "eyyy";
std::string str2 = "jgasgs";
std::string &c = str1 + str2;
std::cout << c << std::endl;
}
哪个不起作用,因为它会为临时对象指定一个正常引用。
#include <iostream>
#include <string>
int main()
{
std::string str1 = "gs";
std::string str2 = "a";
std::string &c = str1 + str2;
std::cout << &(str1 + str2) << std::endl;
}
在这里它不应该让我这样做,因为str1 + str2应该成为一个临时,你不能使用临时的地址。当我搜索它时,显示http://connect.microsoft.com/VisualStudio/feedback/details/807118/temporary-objects-can-be-bound-to-non-const-references,其中sais发出警告4但即使我它仍然有用,为什么这个工作,我该如何解决?同样在第一个例子中,它不使用字符串并抛出异常,第二个仅适用于字符串,第三个也只适用于字符串。
答案 0 :(得分:0)
在C ++中,&#34;不应该工作&#34;并且&#34;没有编译&#34;是不同的东西。
特别是编译器发出的警告就是这样;他们不会阻止汇编。编译器通常有一个叫做#34的选项;将警告视为错误&#34;你应该尽可能地启用它。
希望这也可以捕获到这样一个事实,即你正在返回对局部变量的引用,这是另一件不应该工作的东西,但很乐意编译(甚至在简单的情况下看起来运行正常)。 / p>
答案 1 :(得分:0)
如果您使用的是C ++ 11,则会有一个名为“对象生命周期扩展”的新功能。这取决于具体情况。
http://en.cppreference.com/w/cpp/language/lifetime
“临时的终生 每当引用绑定到临时或临时的基础子对象时,临时的生命周期将扩展为与引用的生命周期匹配,但以下情况除外: 不会扩展对return语句中函数的返回值的临时绑定:它会在返回表达式的末尾立即销毁。这样的函数总是返回一个悬空引用。 绑定到构造函数初始值设定项列表中的引用成员的临时绑定仅在构造函数退出之前持续存在,而不是只要该对象存在。 (注意:从DR 1696开始这样的初始化是不正确的) (直到C ++ 14) 函数调用中的引用参数的临时绑定一直存在,直到包含该函数调用的完整表达式结束:如果函数返回的引用超过了完整表达式,则它将成为悬空引用。 临时绑定到new-expression中使用的初始值设定项中的引用,直到包含该new-expression的完整表达式结束,而不是初始化对象。如果初始化对象超出完整表达式,则其引用成员将成为悬空引用。 一般来说,临时的生命周期不能通过“传递”来进一步扩展:第二个引用,从临时绑定的引用初始化,不会影响其生命周期。“