可能重复:
有人可以向我解释一下移动语义吗?
考虑以下恒定大小数学数组的示例代码:
// 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 的“移动语义”和“移动构造函数”,我想知道是否有办法在这段代码中避免一些临时的。这是真的还是假的?
如果可能的话,怎么做(如果有人可以写一个例子,那就太好了,因为我没有清楚地理解我在移动语义上找到的文档)?