我无法区分两种变体:
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。也许这很容易,但我在找,却找不到。我的英语不好,请不要把我发给硬文档。
答案 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中没有更多的东西。