Почему вы не можете поместить константный объект в контейнер STL?

См. Приведенный ниже код - я пытаюсь поместить константный объект в вектор. Я знаю, что ответ таков: «Контейнеры 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;
}
8
задан David Doria 31 December 2011 в 14:05
поделиться