1

可能重复:
有人可以向我解释一下移动语义吗?

考虑以下恒定大小数学数组的示例代码:

// INCLUDE
#include <iostream>
#include <initializer_list>

// BASE ARRAY
template<class T, unsigned int TSIZE> class BaseArray
{
    public:
    // Constructor
        inline BaseArray() : _data{}
        {
            std::cout<<"BaseArray::BaseArray()"<<std::endl;
        }

    // Copy constructor
        template<class T0> inline BaseArray(const BaseArray<T0, TSIZE> &rhs)
        {
            std::cout<<"BaseArray::BaseArray(const BaseArray<T0, TSIZE> &rhs)"<<std::endl;
            for(unsigned int i = 0; i < TSIZE; ++i) {
                _data[i] = rhs[i];
            }
        }

    // Initializer list constructor
        template<class T0> inline BaseArray(const std::initializer_list<T0>& rhs)
        {
            std::cout<<"BaseArray::BaseArray(const std::initializer_list<T0>& rhs)"<<std::endl;
            const T0* it = rhs.begin();
            for (unsigned int i = 0; i < TSIZE; ++i) {
                _data[i] = *it;
                ++it;
            }
        }

    // Destructor
        inline ~BaseArray()
        {
            std::cout<<"BaseArray::~BaseArray()"<<std::endl;
        }

    // Subscript operator
        inline const T& operator[](const unsigned int i) const
        {
            std::cout<<"BaseArray::operator[](const unsigned int i) const"<<std::endl;
            return _data[i];
        }
        inline T& operator[](const unsigned int i)
        {
            std::cout<<"BaseArray::operator[](const unsigned int i)"<<std::endl;
            return _data[i];
        }

    // Assignment operator
        template<class T0> inline BaseArray<T, TSIZE>& operator=(const BaseArray<T0, TSIZE>& rhs)
        {
            std::cout<<"BaseArray::operator=(const BaseArray<T0, TSIZE>& rhs)"<<std::endl;
            for (unsigned int i = 0; i < TSIZE; ++i) {
                _data[i] = rhs[i];
            }
            return *this;
        }

    // Sum assignment operator
        template<class T0> inline BaseArray<T, TSIZE>& operator+=(const BaseArray<T0, TSIZE>& rhs)
        {
            std::cout<<"BaseArray::operator+=(const BaseArray<T0, TSIZE>& rhs)"<<std::endl;
            for (unsigned int i = 0; i < TSIZE; ++i) {
                _data[i] += rhs[i];
            }
            return *this;
        }

    // Sum operator
        template<class T0> inline BaseArray<typename std::common_type<T, T0>::type, TSIZE> operator+(const BaseArray<T0, TSIZE>& rhs) const
        {
            std::cout<<"BaseArray::operator+(const BaseArray<T0, TSIZE>& rhs)"<<std::endl;
            return BaseArray<typename std::common_type<T, T0>::type, TSIZE>(*this) += rhs;
        }

    // Data members
    protected:
        T _data[TSIZE];
};

// MAIN
int main()
{
    BaseArray<double, 3> a({1., 2., 3.});
    BaseArray<double, 3> b({4., 5., 6.});
    BaseArray<double, 3> c({7., 8., 9.});
    BaseArray<double, 3> x;
    std::cout<<"------------------------------------------------------------"<<std::endl;
    x = a+b+c;
    std::cout<<"------------------------------------------------------------"<<std::endl;
    return 0;
}

它产生输出:

BaseArray::BaseArray(const std::initializer_list<T0>& rhs)
BaseArray::BaseArray(const std::initializer_list<T0>& rhs)
BaseArray::BaseArray(const std::initializer_list<T0>& rhs)
BaseArray::BaseArray()
------------------------------------------------------------
BaseArray::operator+(const BaseArray<T0, TSIZE>& rhs)
BaseArray::operator+=(const BaseArray<T0, TSIZE>& rhs)
BaseArray::operator[](const unsigned int i) const
BaseArray::operator[](const unsigned int i) const
BaseArray::operator[](const unsigned int i) const
BaseArray::~BaseArray()
BaseArray::operator+(const BaseArray<T0, TSIZE>& rhs)
BaseArray::operator+=(const BaseArray<T0, TSIZE>& rhs)
BaseArray::operator[](const unsigned int i) const
BaseArray::operator[](const unsigned int i) const
BaseArray::operator[](const unsigned int i) const
BaseArray::~BaseArray()
BaseArray::~BaseArray()
BaseArray::~BaseArray()
------------------------------------------------------------
BaseArray::~BaseArray()
BaseArray::~BaseArray()
BaseArray::~BaseArray()
BaseArray::~BaseArray()

Process returned 0 (0x0)   execution time : 0.015 s
Press any key to continue.

我听说过 C++2011 的“移动语义”和“移动构造函数”,我想知道是否有办法在这段代码中避免一些临时的。这是真的还是假的?

如果可能的话,怎么做(如果有人可以写一个例子,那就太好了,因为我没有清楚地理解我在移动语义上找到的文档)?

4

0 回答 0