См. Приведенный ниже код - я пытаюсь поместить константный объект в вектор. Я знаю, что ответ таков: «Контейнеры STL требуют, чтобы объекты можно было назначать и копировать», но, не ссылаясь на стандарт, может ли кто-нибудь объяснить, в чем проблема? Я не понимаю, почему такой класс нельзя скопировать (кроме того, что C ++ этого не позволяет).
Все, что это сохраненное значение, которое нельзя изменять - почему нельзя поместить его в вектор, просто создать еще один из этих объектов?
#include <vector>
// Attempt 1
// /home/doriad/Test/Test.cxx:3:8: error: non-static const member ‘const int MyClass::x’, can’t use default assignment operator
// struct MyClass
// {
// int const x;
// MyClass(int x): x(x) {}
// };
//
// int main()
// {
// std::vector<MyClass> vec;
// vec.push_back(MyClass(3));
// return 0;
// }
// Attempt 2
// /home/doriad/Test/Test.cxx:28:23: error: assignment of read-only member ‘MyClass::x’
struct MyClass
{
int const x;
MyClass(int x): x(x) {}
MyClass& operator= (const MyClass& other)
{
if (this != &other)
{
this->x = other.x;
}
return *this;
}
};
int main()
{
std::vector<MyClass> vec;
vec.push_back(MyClass(3));
return 0;
}
РЕДАКТИРОВАТЬ:
Это можно сделать с помощью std :: set и std :: list. Я предполагаю, что это функция sort () в std :: vector, которая использует присваивание. Это не UB, верно?
#include <set>
// Attempt 1
struct MyClass
{
int const x;
MyClass(int x): x(x) {}
bool operator< (const MyClass &other) const;
};
bool MyClass::operator<(const MyClass &other) const
{
if(this->x < other.x)
{
return true;
}
else if (other.x < this->x)
{
return false;
}
}
int main()
{
std::set<MyClass> container;
container.insert(MyClass(3));
return 0;
}