Как создать контейнер из не копируемых элементов
Есть ли способ использовать контейнеры STL с не копируемыми элементами?
что-то вроде этого:
class noncopyable
{
noncopyable(noncopyable&);
const noncopyable& operator=(noncopyable&);
public:
noncopyable(){};
};
int main()
{
list<noncopyable> MyList; //error C2248: 'noncopyable::noncopyable' : cannot access private member declared in class 'noncopyable'
}
3 ответа
Нет, не копируемые элементы не могут быть в классах контейнера C++.
Согласно стандарту 23.1 пункта 3 "Тип объектов, хранящихся в этих компонентах, должен отвечать требованиям CopyConstructible
типы (20.1.3) и дополнительные требования Assignable
типы ".
Один из вариантов - создать список указателей на элементы (предпочтительно, shared_ptr). Это не совсем то, что вы хотите, но это сделает работу.
Другой вариант - использовать библиотеку Boost Pointer Container. Это действует так же, как стандартный контейнер std::auto_ptrs, если бы это было возможно: он сохраняет исключительное право собственности на свои элементы и не может быть скопирован. Он также имеет меньше накладных расходов, чем стандартный контейнер shared_ptrs.