移动构造函数不会被触发

Move constructor doesn't get fired

本文关键字:构造函数 移动      更新时间:2023-10-16

为什么在这个类移动构造函数不被解雇?

#include <iostream>
#include <algorithm>
using std::cout;
template<class T>
class Movable
{
    using value_type = T;
    using pointer_type = T*;
    const std::size_t init_size_{ 1 };
    std::size_t current_size_{ init_size_ };
    const value_type init_value_{ 0 };
    pointer_type data_ = new value_type[init_size_]{init_value_};
public:
    Movable();
    Movable(Movable&&);
    virtual ~Movable();
};
   template<class T>
Movable<T>::Movable(Movable&& dead_meat)
{
    data_ = dead_meat.data_;
    current_size_ = dead_meat.current_size_;
    dead_meat.data_ = nullptr;
    dead_meat.current_size_ = 0;
    cout << "Move ctor";
}
template<class T>
Movable<T>::Movable()
{
    cout << "dflt ctorn";
}

#include "Movable.hpp"
int main()
{
    auto m_var{ Movable<int>{} };
    return 0;
}

所发生的是,只有默认构造函数被触发。如果你能解释一下为什么以及如何做到这一点,那就太好了。

完全独立于复制和移动,这样的初始化允许完全忽略。这意味着对象是就地构造的。这是一种标准允许的"优化"