右值何时失效/被视为未定义?
下面是两个示例,其中一个将右值存储在局部变量中,然后对该局部变量执行操作,另一个示例显示将右值的成员立即传递给也对数据进行操作的函数.
我怀疑示例 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);
}
最佳答案
第二个结构良好。 Temporaries完整表达后将被销毁。
All temporary objects are destroyed as the last step in evaluating the full-expression that (lexically) contains the point where they were created, ...
给定 do_stuff_with_data(container(123).data);
,临时对象(即 container(123)
)将在完整表达式之后被销毁,其中包含调用do_stuff_with_data
。
另一方面,第一个可能有未定义的行为。完整表达式完成后,临时对象已被销毁,并且 arr
变为悬挂状态。稍后对其进行任何取消引用都会导致 UB。
关于c++ - 立即传递其成员时的右值范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59125219/