C++ 立即传递其成员时右值的范围

C++ 立即传递其成员时右值的范围,c++,pointers,scope,lifetime,temporary,C++,Pointers,Scope,Lifetime,Temporary,右值何时失效/被视为未定义 下面是两个示例,其中一个示例将rvalue存储在局部变量中,然后对该局部变量执行操作,另一个示例显示将rvalue的一个成员立即传递给也对数据进行操作的函数 我怀疑示例1是未定义的行为,因为在我自己的代码中,这是一个最小的可复制示例,应用程序完全失败,而示例2则没有。2也是未定义的行为吗?以下哪一个例子是 struct container { int data[5]; container(int a) { data[0] = a;

右值何时失效/被视为未定义

下面是两个示例,其中一个示例将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
}
vs


第二个是结构良好的。将被完全表达后销毁

所有临时对象都将作为评估对象的最后一步被销毁 在词汇上包含它们所在点的完整表达式 创建

给定dou stuff_和_datacontainer123.data;,临时对象(即container123)将在完整表达式之后被销毁,该表达式包含对do_stuff_和_数据的调用


另一方面,第一个可能有未定义的行为。在完整表达式之后,临时对象被销毁,arr变为悬空状态。任何对它的撤销都会导致UB。

我的名字被偷了!:-干杯。
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);
}