分配对临时对象 c++ 视觉对象的引用

Assigning reference to temp object c++ visual

本文关键字:对象 引用 视觉 c++ 临时对象 分配      更新时间:2023-10-16

每当我运行这样的代码时,我都会注意到 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++中,"不应该工作"和"不编译"是不同的东西。

特别是,编译器发出的警告就是这样;它们不会阻止编译。编译器通常有一个名为"将警告视为错误"的选项,您应该尽可能启用该选项。

希望这也抓住了您返回对局部变量的引用的事实,这是另一件不应该工作但会愉快地编译的事情(甚至在简单情况下看起来可以正确运行)。