KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I'm fighting the following proposal now, and I want to know legal and for lesser extent moral arguments against it or for it. What we had: #include <vector> class T; class C { public: C() { } ~C( ) { /*something non-trivial: say, calls delete for all elements in v*/ } // a lot of member functions that modify C // a lot of member functions that don't modify C private: C(C const &); C& operator=(C const&); private: std::vector< T* > v; }; void init(C& c) { } // cannot be moved inside C // ... int main() { // bad: two-phase initialization exposed to the clients C c; init(c); // bad: here follows a lot of code that only wants read-only access to c // but c cannot be declared const } What has been proposed: #include <vector> class T; class C { public: C() { } ~C( ) { /*calls delete for all elements in v*/ } // MADE PUBLIC C(C const &); // <-- NOT DEFINED // a lot of member functions that modify C // a lot of member functions that don't modify C private: C& operator=(C const&); private: vector< T* > v; }; C init() // for whatever reason object CANNOT be allocated in free memory { C c; // init c return c; } // ... int main() { C const & c = init(); } This compiles and links (and works) using recent g++ (which is the only target compiler) both 4.1.2 and 4.4.5 -- because of (N)RVO the copy-constructor is never called; destructor is called at the end of main() only. It is claimed that the technique is perfectly fine, because there is no way copy-constructor could be mis-used (if it ever have been generated it would be linker error), and making it public prevents compiler for complaining about private one. It looks really-really wrong for me to use such trick, which I feel contradicts the C++ spirit and looks more
Tags (comma-separated)
Save Edits
Cancel