问题
msvc's code analyzer for the cpp core guidelines tells me
Warning C26472 Don't use a static_cast for arithmetic conversions. Use brace initialization, gsl::narrow_cast or gsl::narrow (type.1).
for this snippet
static_cast<IntType>(static_cast<unsigned long long>(hexValue(digit)) << (digitIdx * 4));
Why shouldn't I use static_cast here?
Also, with brace init this would look like this
IntType{unsigned long long{hexValue(digit)} << (digitIdx * 4)};
which doesn't look any better imo. This looks more like a function style cast than anything else.
I cannot use gsl and I think gsl::narrow is a wrapper around static_cast itself, so is this purely a readability issue here?
回答1:
so is this purely a readability issue here?
Nope. Brace initialization prohibits narrowing conversions, and will cause a diagnostic. The guideline's purpose is to help protect code from unintended narrowing. A static_cast will allow a narrowing conversion through silently.
You seem to be dealing in integers, so short of using an extended integer type that is larger than unsigned long long, you'll probably not hit any narrowing.
But the guideline is there for the general case, and it's better to write code consistently, even when there is no actual risk.
回答2:
Here is a link to Microsoft documentation:
[https://docs.microsoft.com/en-us/cpp/code-quality/c26472?view=vs-2019][1]
- gsl::narrow ensures lossless conversion and causes run-time crash if it is not possible.
- gsl::narrow_cast clearly states that conversion can lose data and it is acceptable.
static_cast doesn't perform these checks, so it is safer to explicitly state your intentions.
来源:https://stackoverflow.com/questions/62410916/dont-use-static-cast-for-arithmetic-conversions-cpp-core-guidelines