Я читаю великую книгу BJARNE STROUSTRUP: Программирование: принципы и практики с использованием программирования на C ++. Я читаю ту часть, в которой он пытается показать, как создать вектор. Однако одно предложение поймало меня. (Я могу указать вам местоположение этого предложения во всей книге, если вы также читаете эту книгу, что маловероятно, поэтому я не нахожу ее здесь.)
"Мы перемещаем элемент в новое пространство, создавая копию в неинициализированном пространстве и затем уничтожая оригинал. Мы не можем использовать присваивание, потому что для типов, таких как строка, присваивание предполагает, что целевая область была инициализирована."
Чтобы помочь вам получить контекст, я приведу здесь несколько кодов:
template<typename T, typename A = allocator<T>> class my_vector {
A alloc; // use allocate to handle memory for elements
// . . .
private :
T* elem;
int sz;//short for size
int space;//actually means capacity here.
};
Он пытается показать, как реализовать reserve()
. Реализация здесь:
template<typename T, typename A>
void my_vector<T,A>::reserve(int newalloc)
{
if (newalloc<=space) return; // never decrease allocation
T* p = alloc.allocate(newalloc); // allocate new space
/***/for (int i=0; i<sz; ++i) alloc.construct(&p[i],elem[i]);// copy!!! he means we can't use copy assignment operator here!
for (int i=0; i<sz; ++i) alloc.destroy(&elem[i]); // destroy
alloc.deallocate(elem,space); // deallocate old space
elem = p;
space = newalloc;
}
Он означает, что мы можем только скопировать конструкцию elem
, используя alloc.construct()
, вместо использования простого назначения копирования, такого как p[i] = elem[i]
. И причина, по которой он приводит это то, что я цитировал выше.
Предполагая, что назначение копирования определено для универсального типа T (возможно, с использованием Concepts), почему назначение копирования не может использоваться здесь до сих пор? Он говорит
"например, string, assignment предполагает, что целевая область была инициализирована".
Однако я все равно не понимаю. Можете ли вы помочь мне понять его суть? Я думаю, что назначение копирования работает хорошо, даже если цель не инициирована, в конце концов, цель - это та, которая должна быть инициирована.
Спасибо!