Vea el siguiente código: Estoy tratando de poner un objeto const en un vector. Sé que la respuesta es "Los contenedores STL requieren objetos para ser asignables y copiar constructables", pero, sin citar el estándar, ¿alguien puede explicar cuál es el problema al hacer esto? No entiendo por qué una clase como esta no pudo ser copiada (además de que C++ no lo permite).¿Por qué no puedes poner un objeto const en un contenedor STL?
Todo lo que tiene es un valor almacenado que no puede cambiarse. ¿Por qué no ponerlo en un vector simplemente crea otro de estos objetos?
#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;
}
EDIT:
Es posible hacer esto con std :: set y std :: lista. Supongo que es la función sort() en std :: vector que usa la asignación. Esto no es UB ¿verdad?
#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;
}
Semirelacionado: http://stackoverflow.com/questions/2759350/embarassing-c-question-regarding-const/2759426#2759426 – cHao
Consulte mi edición usando std :: set en lugar de std :: vector. ¿Esta bien? –
@David: en C++ 03, el uso de 'std :: set <>' como tal todavía está mal formado, el §23.1/3 establece que los tipos de elementos deben ser tanto constructables como de copia y asignables. En C++ 11, su código está bien formado, pero su instancia 'std :: set <>' no será asignable porque 'MyClass' no es asignable. (Además, solo semi-relacionado: su implementación 'operator '' está rota, ya que no devolverá ningún valor si 'this-> x == other.x'). – ildjarn