[Development] RFF: nullptr rules
Marc Mutz
marc.mutz at kdab.com
Wed Dec 9 22:54:22 CET 2015
On Wednesday 09 December 2015 16:14:00 Marc Mutz wrote:
> Hi,
>
> in 5.7, nullptr (Q_C_NULLPTR) is required to be supported by the compiler,
> but there are no guidelines as to its use in the coding conventions (to
> the extent they need to be in there).
>
> I propose the following, based on Thiago's proposal from January this year,
> considering the new situation that we now require nullptr support in the
> compiler:
>
> - 0 as a nullptr constant is banned except in tests testing APIs so
> we don't accidentally require nullptr (ie. all tests should use 0, not
> nullptr, as far as it makes sense)
> - clang-modernize is used to convert all uses of the null pointer constant
> to nullptr, incl. examples, excl. tests and 3rdparty
> - compilers that have it, will have -Wzero-as-nullptr-constant added during
> headersclean[0]
> - APIs that require the use of nullptr for disambiguation are discouraged,
> but may be acceptable to be decided on a case-by-case basis.
> - Accidental (ie. non-apidox'ed) reliance on nullptr for disambiguation is
> always an error. To this end, tests should continue to use 0, not
> nullptr. - if (!foo) vs. if (foo == nullptr), if (foo) vs. if (foo !=
> nullptr): author's prerogative[1]
>
> [0] I'd prefer "when building Qt", but realise that we'll have problems
> with upstream libs
> [1] I prefer the short form, but I don't think we'll gain a consensus here,
> so let's not even try
>
> Arguments in favour:
> - it's the C++ way of writing the null pointer constant these days
> - we need to use it in headers, anyway, to allow people to use
> -Wzero-as..., and it makes no sense to have two sets of rules for headers
> and impl - it can disambiguate code and prevent accidents
> - in some situations, it makes code easier to understand (:
> m_foo(nullptr)).
>
> Arguments against:
> - it's uglier than "0", and more to type
Because it's coming up again to have nullptr only in some places and leave 0
in others:
The predictable "let's use it only in X" reply is a rearguard battle trying to
keep the _inevitable_ change from 0 to nullptr contained to a certain subset
of cases, thereby complicating the ruleset, subsequently the reviews based on
that ruleset and thwards automatic migration.
Converting _all_ null pointer constants to nullptr is a simple run of clang-
modernize. It is reasonable to trust the tool and not review every single
instance by multiple people on Gerrit, but wave it though into CI quickly.
But if we have a complicated ruleset for when to use nullptr and when to use
0, the person submitting the results of clang-modernize will have to wade
through the changes one-by-one, separating the wanted from the unwanted
changes. Then a few Gerrit reviewers will have to review all the changes
_again_, matching against the ruleset, discussing unclear situations....
All this just because some people have an aesthetic problem with "nullptr".
Guess what, you can always s/nullptr/0/ for display, but the converse is _not_
possible.
Whatever happened to KISS?
Thanks,
Marc
--
Marc Mutz <marc.mutz at kdab.com> | Senior Software Engineer
KDAB (Deutschland) GmbH & Co.KG, a KDAB Group Company
Tel: +49-30-521325470
KDAB - The Qt Experts
More information about the Development
mailing list