你如何实例化智能指针class成员?

How do you instantiate smart pointer class members?

我最近一直在做一些非常狡猾的智能指针编程,因为我从来没有真正理解移动构造函数、移动赋值等,因为像 MSDN 这样的地方给出的例子对我来说真的很费解。所谓狡猾,我的意思是从字面上改变像 (lvalue + 0) 这样的事情来制作右值。

举个例子(我不善于想出不深奥的场景):

class Person {
public:
    Person(int age) {
        age_ = age;
    }

private:
    int age_;
};

class Life {
public:
    Life(int age) {
        person_ = std::make_unique<Person>(age);
    }
private:
    std::unique_ptr<Person> person_;
};

年龄部分必须是右值,使它成为右值的正确方法是什么?我读过有关移动构造函数的内容,但它们似乎正在传递对象本身的右值引用?

编辑:此外,是否可以从 class 构造函数的成员初始化列表中初始化智能指针成员?

您可以简单地执行以下操作,创建一个 Person 指针并将其分配给 unique_ptr:

class Life {
 public:
  Life(int age) : person_(new Person(age)) {}
  ...

首先,如果您需要左值的右值,直接的方法是 std::move(a),仅此而已,但重要的是要注意您正在用它做什么。您正在将您的引用转换为左值,这意味着 "if you need you could change that because I do not need anymore that values".

但是在你的情况下,它们是右值还是左值并不重要,因为你的 int 参数是一个传递复制值,这只与你有一个 Person(int& age) 或 Person(int&& age) 有关, 什么不是你的情况。

但在这种情况下很重要

std::vector<int> b = ...
std::vector<int> a = b; //rvalue, means keep safe this data, I still need them 
std::vector<int> a = std::move(b);//lvalue, could be changed
std::vector<int> a = f(); //lvalue, could be changed since is just a temporary data