4 ms·
I've only been using C++ for a few months, but it's my opinion that all function parameters should have been "const &" by default (except for maybe primitive ty
by fferen 15y ago
I've only been using C++ for a few months, but it's my opinion that all function parameters should have been "const &" by default (except for maybe primitive types). Const correctness has helped me spot some nasty bugs, and it's too easy to accidentally forget the "&" and pass horrendously large structures by value, which must go through a copy constructor and destructor with every call. Plus, it gets really tedious typing "const Mat &src" a million times (guess which library I'm using, lol).
- octopus 15y agoIn C++11 "type const &name" can be simply replaced with "type name", no performance penalty involved.
- ajax77 15y agoThat's simply not the case.. In general, the "no penalty" holds true for primitive data types, and when passing an r-value instance of a class that has a move copy constructor defined. In the case where your object is an expensively constructed l-value, it is preferable to pass by const reference rather than value (assuming you plan to use the object later... otherwise you could indeed pass using std::move semantics).
- octopus 15y agoIn C++11 you are supposed to use move semantics in your own classes. I'm not 100% sure but I think the standard require that the STL use move semantics.
- cageface 15y agoYes but this is one more thing you have to think about when implementing a class in C++ and one more chance to screw it up. It makes vanilla C and raw pointers look a lot more appealing, to be honest.
- octopus 15y agoActually I think C++11 is a simpler language than C++03 or C++98. The problem is that we need to un-learn what we know and learn the new way of doing things.
- cageface 15y agoC++11 is simpler for the casual user of classes but I'm not so sure it's easier if you're implementing a lot of classes yourself. I disable assignment and copying in all my classes by default unless I have a really good reason to implement them and I still pass by const & for types I define myself.