[Development] Suggested addition to wiki.qt.io/Coding_Conventions

Marc Mutz marc.mutz at kdab.com
Tue May 19 11:47:47 CEST 2015


On Saturday 16 May 2015 22:01:36 Marc Mutz wrote:
> On Wednesday 13 May 2015 09:30:05 Thiago Macieira wrote:
> > The drawbacks only appear in debug builds, so is this worth the
> > uglification?
> 
> Yet another example of things that go wrong when blindly exporting
> classes wholesale:
>  
> http://testresults.qt.io/logs/qt/qtdeclarative/472c6e2acc170082356db371eb3
> 2b518c449d600/windows7x86windows7x86msvc2010release_developer-
> build/708d34c65c2d74994ac0344f9912adbefe88e067/buildlog.txt.gz
> (from https://codereview.qt-project.org/112431).
> 
> Mind you, the Coding Conventions already forbid to inherit from
> template classes. It's just that it wasn't fixed for Qt 5.
> 
> But the root problem isn't inheriting from templates, it's exporting
> the whole subclass.
> 
> Convinced now?

Taking this train of thought one stop further: this is also makes QString BiC:

  class Q_CORE_EXPORT QString
  {
  public:
    // ...
#ifdef Q_COMPILER_RVALUE_REFS
    inline QString(QString && other) Q_DECL_NOTHROW : d(other.d)
    { other.d = Data::sharedNull(); }
    inline QString &operator=(QString &&other) Q_DECL_NOTHROW
    { qSwap(d, other.d); return *this; }
#endif

By Sergio's problem, an application built in C++11 debug mode should not be 
able to link against a QtCore built in C++98 mode, either (unresolved 
QString(QString &&)). Yet, that is what we wanted to support with the policy 
that all C++11 code needs to be inline-only.

And don't tell me this ain't a problem in practice - it just caused a CI 
failure on the above-mentioned, perfectly valid, patch :)

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