Community
Participate
Working Groups
A little checker which I plan to do soon: IIRC it's good style to mark one-parameter constructors as explicit unless the programmer intends them to be used as converting constructors. Example: struct X { X(int a) { } // warning: converting constructor }; Proposed quick fixes: - change to explicit X(int a) - mark with comment: /* implicit */ X(int a) or something similar (same comment-based solution as with the case fall through checker).
Created attachment 199968 [details] working checker (w.i.p.) Stil todo: - tests - strings - add a preference for comment pattern - quick fixes
Created attachment 199969 [details] examples Attaching some code to discuss the behaviour on (i'm going to base the tests on that). Issues: 1) `explicit` on a copy constructor - this has its purpose (block implicit copying via function calls etc), but is used rarely. Either a Codan info marker or no marker at all - which? 2) `explicit` on a move constructor (c++0x) - i'm not familiar with any use case for that, and it breaks compatibility with some STL (http://bit.ly/oCPJt2), I recommend a warning. 3) Categories. I've used Programming Style for most, and Programming Problems for `explicit` on a move constructor (see (2)). Is that OK? Also maybe it would make sense to introduce a new sub-category under Programming Style for those problems? There's a couple of them and they're fine-grained and related. 4) What should be the default magic comment to indicate that converting constructor is intentional? I've suggested "implicit" as opposed to the `explicit` keyword, that is one option.