代码之家  ›  专栏  ›  技术社区  ›  void main

立即传递其成员时rvalue的范围

  •  2
  • void main  · 技术社区  · 6 年前

    rvalue何时失效/被视为未定义?

    下面是两个示例,其中一个将rvalue存储在局部变量中,然后对该局部变量执行操作,另一个示例显示rvalue的一个成员被立即传递给同时对数据进行操作的函数。

    我怀疑示例1是未定义的行为,就像在我自己的代码中一样(这是一个最小的可复制示例),应用程序完全失败,而2没有。2也是未定义的行为吗?哪些例子是?

    struct container {
        int data[5];
        container(int a) {
            data[0] = a;
        }
    };
    
    void main() {
        int* arr = container(123).data;
    
        // ... do stuff with data
    }
    

    对

    struct container {
        int data[5];
        container(int a) {
            data[0] = a;
        }
    };
    
    void do_stuff_with_data(int* data) {
        // ... do stuff with data
    }
    void main() {
        do_stuff_with_data(container(123).data);
    }
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   songyuanyao    6 年前

    第二个很好。 Temporaries 将在完全表达后销毁。

    作为评估 完全表达(词汇)包含它们所在的点。 创建。。。

    鉴于 do_stuff_with_data(container(123).data); ,临时对象(即。 container(123) )将在包含调用 do_stuff_with_data .

    另一方面,第一个可能有未定义的行为。在完整表达式之后,临时对象已被破坏,并且 arr 变得悬着。任何对它的取消引用都会导致UB。