为什么我们可以非常量引用一个临时对象并延长其寿命?

xmllmx
#include <iostream>

using namespace std;

struct A
{
    A()
        : _p(new int(1))
    {}

    ~A()
    {
        *_p = 0;

        delete _p;
        _p = nullptr;
    }

    int* _p;
};

int main()
{
    //
    // Let r_to_a reference to a temporary object
    //
    A& r_to_a = A();

    //
    // Is r_to_a still valid now?
    //
    cout << *r_to_a._p << endl; // Output : 1 instead of a run-time error
}

据我所知,非常量引用临时对象的格式不正确。但是,上面的代码表明在C ++中似乎合法。为什么?

我的编译器是VC ++ 2013。

蚂蚁

该代码并没有真正表明它在C ++中是合法的。它只是表明您的编译器支持非标准的编译器扩展。您必须查阅编译器文档,以了解是否延长了临时文件的寿命。您的实验似乎表明它已扩展。

但是,您的代码在标准C ++中格式不正确。如果通过使用/Za选项在该编译器中禁用了编译器扩展,它还将拒绝接受您的代码:

error C2440: 'initializing' : cannot convert from 'A' to 'A &'

另外,为避免使用/Za(显然已损坏),您可以执行

#pragma warning(error : 4239)

或更改下的相应项目设置,C/C++ -> Advanced -> Treat Specific Warnings As Errors以更有针对性的方式禁止此特定功能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当我们使2个对象的哈希码指向一个地址时,为什么它是临时的?

来自分类Dev

为什么我们在原型继承中使用一个临时框?

来自分类Dev

对临时对象的哪些操作可以防止其寿命延长?

来自分类Dev

为什么我们需要一个默认的构造函数来在C ++中通过引用传递对象?

来自分类Dev

const引用类成员是否可以延长临时对象的寿命?

来自分类Dev

为什么const引用不能延长通过函数传递的临时对象的寿命?

来自分类Dev

为什么我们需要创建一个one-arg构造函数才能使用临时的无名对象?

来自分类Dev

为什么我们可以在C ++中将取消引用的指针增加到常量数据?

来自分类Dev

C# - 为什么我们可以继承一个接口两次?

来自分类Dev

为什么我们需要一个用户提供的const对象构造函数?

来自分类Dev

为什么我们需要在堆中创建一个对象?

来自分类Dev

为什么我们在 main 函数中启动一个对象

来自分类Dev

使用const引用延长临时对象的寿命

来自分类Dev

三元运算符,并通过引用常量来延长临时对象的寿命

来自分类Dev

我们可以使用临时表创建一个永久表吗

来自分类Dev

我们可以从const对象中引用一个setter成员函数作为const吗?

来自分类Dev

为什么我们在html中使用id。我认为我们可以将一个类用作id

来自分类Dev

为什么我们需要一个“MultiRepositoryProvider”和一个单独的“MultiBlocProvider”?

来自分类Dev

为什么在关闭系统时我们可以杀死另一个用户的进程

来自分类Dev

如果我们从函数构造函数创建一个名为“ a”的对象,那么为什么“ a”不是Function的实例?

来自分类Dev

为什么我们必须创建一个新对象“输入”而不是直接使用 Scanner.nextLine() ?

来自分类Dev

为什么我们需要一个扫描器对象来在 java 中获取输入

来自分类Dev

通过获取对子对象的引用来延长临时对象的寿命

来自分类Dev

非常量引用为什么不能绑定到临时对象?

来自分类Dev

为什么我们创建一个变量来引用一个类而不是仅仅使用document.querySelector(“。class”)?

来自分类Dev

我们可以从javascript中的单个对象键值中获取一个对象吗?

来自分类Dev

当我们有一个红色区域时,为什么我们需要堆栈分配?

来自分类Dev

为什么我们需要两个接口来枚举一个集合?

来自分类Linux

为什么我们可以分配一个1 PB(10 ^ 15)的数组并访问最后一个元素,但是不能释放它呢?

Related 相关文章

  1. 1

    当我们使2个对象的哈希码指向一个地址时,为什么它是临时的?

  2. 2

    为什么我们在原型继承中使用一个临时框?

  3. 3

    对临时对象的哪些操作可以防止其寿命延长?

  4. 4

    为什么我们需要一个默认的构造函数来在C ++中通过引用传递对象?

  5. 5

    const引用类成员是否可以延长临时对象的寿命?

  6. 6

    为什么const引用不能延长通过函数传递的临时对象的寿命?

  7. 7

    为什么我们需要创建一个one-arg构造函数才能使用临时的无名对象?

  8. 8

    为什么我们可以在C ++中将取消引用的指针增加到常量数据?

  9. 9

    C# - 为什么我们可以继承一个接口两次?

  10. 10

    为什么我们需要一个用户提供的const对象构造函数?

  11. 11

    为什么我们需要在堆中创建一个对象?

  12. 12

    为什么我们在 main 函数中启动一个对象

  13. 13

    使用const引用延长临时对象的寿命

  14. 14

    三元运算符,并通过引用常量来延长临时对象的寿命

  15. 15

    我们可以使用临时表创建一个永久表吗

  16. 16

    我们可以从const对象中引用一个setter成员函数作为const吗?

  17. 17

    为什么我们在html中使用id。我认为我们可以将一个类用作id

  18. 18

    为什么我们需要一个“MultiRepositoryProvider”和一个单独的“MultiBlocProvider”?

  19. 19

    为什么在关闭系统时我们可以杀死另一个用户的进程

  20. 20

    如果我们从函数构造函数创建一个名为“ a”的对象,那么为什么“ a”不是Function的实例?

  21. 21

    为什么我们必须创建一个新对象“输入”而不是直接使用 Scanner.nextLine() ?

  22. 22

    为什么我们需要一个扫描器对象来在 java 中获取输入

  23. 23

    通过获取对子对象的引用来延长临时对象的寿命

  24. 24

    非常量引用为什么不能绑定到临时对象?

  25. 25

    为什么我们创建一个变量来引用一个类而不是仅仅使用document.querySelector(“。class”)?

  26. 26

    我们可以从javascript中的单个对象键值中获取一个对象吗?

  27. 27

    当我们有一个红色区域时,为什么我们需要堆栈分配?

  28. 28

    为什么我们需要两个接口来枚举一个集合?

  29. 29

    为什么我们可以分配一个1 PB(10 ^ 15)的数组并访问最后一个元素,但是不能释放它呢?

热门标签

归档