初始化顺序和移动语义

时间:2018-07-08 04:45:04

标签: c++ c++11

我删除了以下示例代码。 在我看来,该代码通向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));
}

1 个答案:

答案 0 :(得分:3)

  

从一个角度来看,std :: move()只是使类型强制转换为x,仅此而已

那是不正确的。由于fun2需要一个对象,因此可以使用编译器生成的move构造函数来构造对象。

  

另外,z可以在x.val解引用之前进行移动构造。可以吗?

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

您的程序有未定义的行为。