std :: unique_ptr <type>和type&amp;&amp ;?之间有什么区别?

时间:2017-12-08 12:16:43

标签: c++ c++11

我无法区分两种变体:

class test {
    std::unique_ptr<std::vector<float>> m_field;
    test(const std::vector<float>&& values) : m_field{std::make_unique<vector<float>>(std::move(values))} {}
};  

并且

class test {
    const std::vector<float>&& m_field;
    test(const std::vector<float>&& values) : m_field{std::move(values)} {}
}; 

在第一个版本中,默认析构函数会自动删除unique_ptr和内部vector,但在第二个版本中会发生什么,默认析构函数将如何工作?
什么变体更好?
P.S。也许这很容易,但我在找,却找不到。我的英语不好,请不要把我发给硬文档。

1 个答案:

答案 0 :(得分:1)

当我们在构造函数中删除test时,第一个const类很有用,它应该是

class test {
public:
std::unique_ptr<std::vector<float>> m_field;
test(std::vector<float>&& values) : m_field{std::make_unique<vector<float>>(std::move(values))} {}
};  

因为可以在非const对象上完成移动操作。 例如

vector<float> v(20, 3.0);
test t(move(v));
cout << v.size() << endl; // print 20 if `const` will be in constructor definition
                     // print 0 if `const` specifier is missed in constructor, object was moved  

第二个测试类是无稽之谈。这个类的析构函数什么也没做。在构造函数m_field中,成员被初始化并指向传递的向量,并且它就是全部,在这个类的ctor / dtor中没有更多的东西。