4 ms·
I think the first example is sorta invalid because there's a typo: return *(uint32_t*)f; should read as: return *(uint32_t*)(&f); With this change,
by satbyy 11y ago
I think the first example is sorta invalid because there's a typo:
return *(uint32_t*)f;
should read as:
return *(uint32_t*)(&f);
With this change, the code indeed compiles fine (with g++ 5.3.1; not sure of 5.3.0, which the author used)
- Kristine1975 11y agoWith clang 3.7.0 this results in "constexpr function never produces a constant expression", since the C-style pointer cast is essentially a reinterpret_cast (C++14 Standard §5.4p4.4), which is not a "core constant expression" (C++14 Standard §5.20p2.13) and thus must not appear in a constexpr function: C++14 Standard §7.1.5p5: ... if no argument values exist such that an invocation of the function or constructor could be an evaluated subexpression of a core constant expression, the program is ill-formed; no diagnostic required. clang seems to go the extra mile and produces a diagnostic. Incidentally the pointer cast would violate C++'s aliasing rules and thus invoke undefined behavior. P.S: The C++14 Standard is available here: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n429... (never mind the "draft" status)
- satbyy 11y agoInterestingly, g++ gives out a warning (correctly) when compiled with -O2, but not by default (-O0): warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] So, you're right indeed.
- sebastic 11y agoPlease stop using C-style casts. It's 2016. C++ != C. Unlearn what you have learned.
- TickleSteve 11y ago'idiomatic C++' != C
- coliveira 11y agoIdiomatic C++ is not well defined. There are so many possible ways to write C++ code that you should be skeptical if somebody promotes one version is the true one.
- mike_hock 11y agoThis is illegal (undefined), but casting to char* and reading out the values is legal.