Конструктор копирования, сгенерированный компилятором, должен инициализировать no2.nameValue и no2.objectValue, используя nol.nameValue и nol.objectValue соответственно. Член nameValue имеет тип string, а в стандартном классе string объявлен конструктор копирования, поэтому no2. nameValue будет инициализирован вызовом конструктора копирования string с аргументов nol.nameValue. С другой стороны, член NameObject Сгенерированный компилятором оператор присваивания для класса Named-Object
template class NamedObject { public: // этот конструктор более не принимает const name, поскольку nameValue – // теперь ссылка на неконстантную строку. Конструктор с аргументом типа // char* исключен, поскольку нам нужна строка, на которую можно сослаться NamedObject(std::string& name, const T& value); … // как и ранее, предполагаем, // что operator= не объявлен private: std::string& nameValue; // теперь это ссылка const T objectValue; // теперь const
Посмотрим, что произойдет в приведенном ниже коде:
std::string newDog(“Persephone”);
std::string oldDog(“Satch”);
NamedObject
// наша собака Персефона собиралась
// встретить свой второй день рождения
NamedObject
// детства) было бы теперь 36 лет
p = s; // Что должно произойти
// с данными-членами p?