c++ - 当引用变量为 'dies' 时,引用变量会发生什么?

标签 c++ lvalue rvalue temporary-objects

假设我创建了一个名为 MyClass 的类,其中包含一个引用变量 m_my_resource。这个引用变量本质上只是一个与其他内存位置关联的命名别名。

我的类(class)

class MyClass
{
    public:    
        MyClass(const MyResource& my_resource) :
            m_my_resource(my_resource){}

    private:
        const MyResource& m_my_resource;
}

现在假设我尝试执行以下操作:

main
{
    MyClass my_class(utils::getMyResource());

    //continue doing stuff
}

在这种情况下究竟发生了什么?我已将 MyClass 定义为只有一个构造函数,该构造函数接收对 MyResource 的引用(左值引用)。

但是,在我的主函数中,我构造了一个带有临时对象(右值)的 MyClass 实例。为什么我的代码能够编译? my_class 现在不包含与某个临时内存位置关联的引用变量吗?本质上,与引用变量相关联的变量现在已经“死亡”,引用变量会发生什么?

此外,在这种情况下我希望我的类有一个接受右值引用的构造函数吗?

最佳答案

Why is my code able to compile?

仅仅因为您的代码可以编译,并不意味着它可以正常工作。否则,世界上的每个程序都会自动无错误,因为它成功地通过了编译阶段,并且没有任何人需要学习如何使用调试器。

显然,事情不是这样进行的。

Doesn't my_class now contain a reference variable that is associated with some temporary memory location?

是的,确实如此。

Essentially the variable in which the reference variable was associated with has now 'died', what happens to the reference variable?

您的引用变量没有任何变化。它仍然存在。但是引用对象——这意味着试图调用它的方法或访问它的成员——results in undefined behavior .

关于c++ - 当引用变量为 'dies' 时,引用变量会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41210288/

相关文章:

c++ - Qt:带有 Qt OSX Yosemite "sed: illegal option -- r"错误的 CUDA

c - 什么是左值和右值表达式?

c++ - 为什么函数名称被归类为 L 值表达式?

c - 需要左值

c++ - 关于左值到右值的转换

c++ - 为什么字符串不会出现左操作数所需的错误左值?

c++ - 如何降低该算法的计算复杂度?

c++ - rint 不存在于 Visual Studio 2010 math.h 中,相当于 CUDA rint

c++ - 当 std::sort 中的比较函数总是返回 true 时,为什么会出现运行时错误?

c++ - 将右值引用绑定(bind)到(自动生成的)左值