Clarify "unnecessary cast" by decomposing the class into identity casts and implicit casts.

This commit is contained in:
Zachary Henkel 2017-06-02 09:24:29 -05:00
parent 4b3352b435
commit f3ff5bae6d
2 changed files with 9 additions and 6 deletions

View File

@ -11620,7 +11620,7 @@ If you feel the need for a lot of casts, there may be a fundamental design probl
##### Alternatives ##### Alternatives
Casts are widely (mis) used. Modern C++ has constructs that eliminate the need for casts in many contexts, such as Casts are widely (mis) used. Modern C++ has rules and constructs that eliminate the need for casts in many contexts, such as
* Use templates * Use templates
* Use `std::variant` * Use `std::variant`
@ -11629,9 +11629,10 @@ Casts are widely (mis) used. Modern C++ has constructs that eliminate the need f
##### Enforcement ##### Enforcement
* Force the elimination of C-style casts * Force the elimination of C-style casts
* Warn if there are many functional style casts (there is an obvious problem in quantifying 'many'). * Warn if there are many functional style casts (there is an obvious problem in quantifying 'many')
* The [type profile](#Pro-type-reinterpretcast) bans `reinterpret_cast`. * The [type profile](#Pro-type-reinterpretcast) bans `reinterpret_cast`.
* Warn against [unnecessary pointer casts](#Pro-type-unnecessarycast). * Warn against [identity casts](#Pro-type-identitycast) between pointer types, where the source and target types are the same (#Pro-type-identitycast)
* Warn if a pointer cast could be [implicit](#Pro-type-implicitpointercast)
### <a name="Res-casts-named"></a>ES.49: If you must use a cast, use a named cast ### <a name="Res-casts-named"></a>ES.49: If you must use a cast, use a named cast
@ -19401,8 +19402,9 @@ Type safety profile summary:
* <a name="Pro-type-avoidcasts"></a>Type.1: [Avoid casts](#Res-casts): * <a name="Pro-type-avoidcasts"></a>Type.1: [Avoid casts](#Res-casts):
<a name="Pro-type-reinterpretcast">a. </a>Don't use `reinterpret_cast`; A strict version of [Avoid casts](#Res-casts) and [prefer named casts](#Res-casts-named). <a name="Pro-type-reinterpretcast">a. </a>Don't use `reinterpret_cast`; A strict version of [Avoid casts](#Res-casts) and [prefer named casts](#Res-casts-named).
<a name="Pro-type-arithmeticcast">b. </a>Don't a `static_cast` for arithmetic types; A strict version of [Avoid casts](#Res-casts) and [prefer named casts](#Res-casts-named). <a name="Pro-type-arithmeticcast">b. </a>Don't use `static_cast` for arithmetic types; A strict version of [Avoid casts](#Res-casts) and [prefer named casts](#Res-casts-named).
<a name="Pro-type-unnecessarycast">c. </a>Don't use pointer unnecessary pointer casts; A strict version of [Avoid casts](#Res-casts) <a name="Pro-type-identitycast">c. </a>Don't cast between pointer types where the source type and the target type are the same; A strict version of [Avoid casts](#Res-casts).
<a name="Pro-type-implicitpointercast">d. </a>Don't cast between pointer types when the conversion could be implicit; A strict version of [Avoid casts](#Res-casts).
* <a name="Pro-type-downcast"></a>Type.2: Don't use `static_cast` to downcast: * <a name="Pro-type-downcast"></a>Type.2: Don't use `static_cast` to downcast:
[Use `dynamic_cast` instead](#Rh-dynamic_cast). [Use `dynamic_cast` instead](#Rh-dynamic_cast).
* <a name="Pro-type-constcast"></a>Type.3: Don't use `const_cast` to cast away `const` (i.e., at all): * <a name="Pro-type-constcast"></a>Type.3: Don't use `const_cast` to cast away `const` (i.e., at all):

View File

@ -214,6 +214,7 @@ HTTP
Hyslop Hyslop
i2 i2
IDE IDE
identitycast
IDEs IDEs
IEC IEC
ifdef ifdef
@ -221,6 +222,7 @@ iff
ifstream ifstream
impactful impactful
Impl Impl
implicitpointercast
incompleat incompleat
increment1 increment1
Incrementable Incrementable
@ -551,7 +553,6 @@ uniqueptrparam
unittest unittest
unittests unittests
unnamed2 unnamed2
unnecessarycast
use1 use1
users' users'
UTF UTF