[Development] Proposal: adding Q_DECL_NOEXCEPT to many methods
lars.knoll at nokia.com
lars.knoll at nokia.com
Thu Aug 2 15:00:22 CEST 2012
I'd say go ahead. Since adding it shouldn't change the ABI/name mangling, we can introduce this gradually anyway.
Cheers,
Lars
On Aug 2, 2012, at 2:50 PM, ext Thiago Macieira <thiago at kde.org>
wrote:
> I'd like to propose we add Q_DECL_NOEXCEPT to many methods in our API.
>
> We already took the decision to turn exception off in most modules, except
> QtCore and where exceptions were used, like QtXmlPatterns. This is the next
> step.
>
> The Q_DECL_NOEXCEPT macro expands to noexcept, which is a new C++11 keyword.
> It is equivalent to noexcept(true), also new in C++11, and it means the method
> declares that it does not throw any exceptions.
>
> The benefits are:
> - callers do not need to emit exception handlers around such functions
> - the compiler may assume that no exception unexpectedly happens inside that
> function body, foregoing exception handlers inside it as well.
>
> The first behaviour is present with a C++03's empty exception specification
> (i.e., throw() in the function declaration), but the second behaviour is new
> in C++11. In the previous standard, the compiler was forced to emit exception
> code for the case when exceptions did happen even when they shouldn't. For
> that reason, the C++03 exception specification is deprecated.
>
> The drawback is that it makes the code ugly.
>
> The macro expands to nothing in C++98 mode. That means code using the API so
> marked and compiling in C++98 mode will simply not gain the benefits of the
> keyword, but should see no side effects.
>
> The presence of the keyword does not affect binary compatibility. With the
> Itanium C++ ABI, it's not present in the mangling. MSVC2010 does not supoprt
> it yet, so I cannot verify what it does. However, since C++11 support cannot
> be turned on or off on it, the keyword will be enabled or it won't depending on
> the compiler version, which means that binary compatibility is irrelevant. But
> if it does encode it in the mangling, we will not be able to add the keyword
> to methods in 5.1 or later.
>
>
> The question that remains is: what methods shall we add this to? We can add it
> to any method for which we can *prove* that it will never throw, which are:
> - leaf functions
> - functions calling only C functions or other noexcept functions
>
> Outside of QtCore, I propose we add it only to methods that are called often
> and frequently. In QtCore, I propose we add it to most tool methods that are
> provably noexcept. For example, the qHash functions, QMutex, our memory
> allocation routines (the throwing is in inline code), etc.
>
> PS: to be clear: new throws.
>
> --
> Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org
> Software Architect - Intel Open Source Technology Center
> PGP/GPG: 0x6EF45358; fingerprint:
> E067 918B B660 DBD1 105C 966C 33F5 F005 6EF4 5358
> _______________________________________________
> Development mailing list
> Development at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/development
More information about the Development
mailing list