gpt4 book ai didi

c++ - 立即通过其成员时右值的范围

转载 作者:行者123 更新时间:2023-12-01 14:40:14 26 4
gpt4 key购买 nike

右值什么时候失效/被认为是未定义的?

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

最佳答案

第二个是格式正确的。完整表达后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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com