分配对临时对象 c++ 视觉对象的引用
Assigning reference to temp object c++ visual
每当我运行这样的代码时,我都会注意到 Visual Studio for 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 应该制作临时,而您不能使用临时地址。当我搜索它时 showshttps://connect.microsoft.com/VisualStudio/feedback/details/807118/temporary-objects-can-be-bound-to-non-const-references 哪个 sais 打开了警告 4,但即使我这样做它仍然有效,那么为什么它会起作用以及如何解决它?同样在第一个示例中,它不适用于字符串并引发异常,第二个仅适用于字符串,第三个也仅适用于字符串。
使用的是C++ 11,则有一个名为"对象寿命延长"的新功能。这取决于上下文。
http://en.cppreference.com/w/cpp/language/lifetime
"临时的一生每当引用绑定到临时对象或临时的基子对象时,临时对象的生存期都会延长以匹配引用的生存期,但以下情况除外:在 Return 语句中,与函数的返回值的临时绑定不会扩展:它会在 Return 表达式结束时立即销毁。此类函数始终返回悬空引用。构造函数初始值设定项列表中引用成员的临时绑定仅保留到构造函数退出为止,而不是在对象存在时保留。(注意:自 DR 1696 起,此类初始化格式不正确)(至C++14)函数调用中引用参数的临时绑定一直存在,直到包含该函数调用的完整表达式结束:如果函数返回的引用比完整表达式的寿命长,则它将成为悬空引用。与新表达式中使用的初始值设定项中的引用的临时绑定一直存在,直到包含该新表达式的完整表达式的末尾,而不是初始化对象的长度。如果初始化的对象比完整表达式的寿命长,则其引用成员将成为悬空引用。一般来说,临时的生存期不能通过"传递它"来进一步延长:从临时绑定的参照初始化的第二个参照不会影响其生存期。
在C++中,"不应该工作"和"不编译"是不同的东西。
特别是,编译器发出的警告就是这样;它们不会阻止编译。编译器通常有一个名为"将警告视为错误"的选项,您应该尽可能启用该选项。
希望这也抓住了您返回对局部变量的引用的事实,这是另一件不应该工作但会愉快地编译的事情(甚至在简单情况下看起来可以正确运行)。
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 我们可以有一个 setter 成员函数作为从 const 对象引用的 const 吗?
- C++对象引用返回不同的值
- 对象引用中的字段以不同的方法返回不同的值
- 通过向构造函数其他对象引用页面来创建对象
- 为什么在对象引用恒定时允许更改为另一个类的指针的成员变量
- 如何在C++中读取 HDF5 对象引用
- C++ 未定义的对象引用
- 从函数返回 libconfig 类设置对象引用
- qt vsaddin错误对象引用未设置为对象的istanse
- 在这种情况下,为什么使用 *此必需的对象引用返回对象引用
- 基本C - 构造contaning对象引用,并将其作为方法参数传递
- C :将对象引用作为参数给出错误:呼叫class :: function()的匹配函数
- C++OOP基础知识-是否正确返回对象引用
- 使用对象引用(可能)在调用destructor后使用对象引用
- 创建返回对象引用的成员函数的最简单方法
- 如何在C++上使用对象引用删除对象
- JNI/Android NDK-维护全局对象引用
- 为什么有些类方法返回"*this"(self的对象引用)?
- 在C++中返回伪对象引用的规则