C++ 立即传递其成员时右值的范围
右值何时失效/被视为未定义 下面是两个示例,其中一个示例将rvalue存储在局部变量中,然后对该局部变量执行操作,另一个示例显示将rvalue的一个成员立即传递给也对数据进行操作的函数 我怀疑示例1是未定义的行为,因为在我自己的代码中,这是一个最小的可复制示例,应用程序完全失败,而示例2则没有。2也是未定义的行为吗?以下哪一个例子是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;
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);
}