我删除了以下示例代码。
在我看来,该代码通向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));
}
答案 0 :(得分:3)
从一个角度来看,std :: move()只是使类型强制转换为x,仅此而已
那是不正确的。由于fun2
需要一个对象,因此可以使用编译器生成的move构造函数来构造对象。
另外,z可以在x.val解引用之前进行移动构造。可以吗?
是的,可以。由于标准未指定函数调用中参数的求值顺序,因此有可能x
在评估*(x.val)
之前被移动。
您的程序有未定义的行为。