std::vector of objects and const-correctness

c++, const-correctness, vector

Solution

I'm not sure why nobody said it, but the correct answer is to drop the `const`, or store `A*`'s in the vector (using the appropriate smart pointer).

You can give your class terrible semantics by having "copy" invoke UB or doing nothing (and therefore not being a copy), but why all this trouble dancing around UB and bad code? What do you get by making that `const`? (Hint: Nothing.) Your problem is conceptual: If a class has a const member, the class is const. Objects that are const, fundamentally, cannot be assigned.

Just make it a non-const private, and expose its value immutably. To users, this is equivalent, const-wise. It allows the implicitly generated functions to work just fine.

Problem

Consider the following: ``` class A { public: const int c; // must not be modified! A(int _c) : c(_c) { // Nothing here } A(const A& copy) : c(copy.c) { // Nothing here } }; int main(int argc, char *argv[]) { A foo(1337); vector<A> vec; vec.push_back(foo); // <-- compile error! return 0; } ``` Obviously, the copy constructor is not enough. What am I missing? EDIT: Ofc. I cannot change `this->c` in `operator=()` method, so I don't see how `operator=()` would be used (although required by `std::vector`).

Original source

Related problems