gpt4 book ai didi

c++ - 初始化顺序和移动语义

转载 作者:太空狗 更新时间:2023-10-29 21:11:11 27 4
gpt4 key购买 nike

我截取了以下示例代码。在我看来,代码导致了 UB。可以?从一个角度来看,std::move() 只是在 x 上进行类型转换,仅此而已。从其他方面来看,z 可以在 x.val 取消引用之前移动构造。可以吗?

struct s {
std::shared_ptr<int> val;
};
void fun2(int a, s z) {
}
void fun(s x) {
fun2(*(x.val), std::move(x));
}

最佳答案

From one point of view, std::move() just makes type cast on x and nothing more

这是不正确的。由于 fun2 需要一个对象,因此使用编译器生成的移动构造函数构造一个对象。

From other, z can be move-constructed before x.val dereferencing. Can it?

是的,它可以。由于标准未指定函数调用中参数的求值顺序,因此 x 可以移动*(x.val) 之前 被评估。

您的程序存在未定义的行为。

关于c++ - 初始化顺序和移动语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51228898/

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