Any hint to do proper const static member pointer initialization using C++ 11 and later ?
Source:
struct App {
static const App* ok; static constexpr App* ko = reinterpret_cast<App*>(0xBADC0DE); // <= FTBFS
}; const App* App::ok = reinterpret_cast<App*>(0xBADC0DE);
Try it on latest gcc or clang it will fail :
http://melpon.org/wandbox/permlink/IlXTqNiVoJtnFDg0 http://cpp.sh/96mau http://coliru.stacked-crooked.com/a/e031835a72ed2172
The reason of fail is clear : reinterpret_cast and constexpr are exclusives according to C++11 standard (but was accepted in some compiler).
http://eel.is/c++draft/expr.const#2 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf (p125)
But older 2 steps method still works but not single one (on gcc-6.2.0 at least).
This code looks a bit odd, I agree on that but how to get it working or clang or latest g++.
Declaration and init in 2 places can be a workaround but it does not fully explain (init to nullptr is working of course).
Related errors are :
error: 'constexpr' needed for in-class initialization of static data member error: reinterpret_cast from integer to pointer
More resources:
reinterpret_cast<> and portabilty
</code>
/// @author: http://rzr.online.fr/contact.htm
#include <cstdlib>
// #define FIX // uncomment
/// show why anonymous types are evil in C++
struct foo {
#ifndef FIX
struct {} *m; // anonymous type make cast impossible in C++ (ok on C)
#else
struct foo_m {} *m; // this way the type is named and can be used
#endif
};
int main(int /* argc*/ , char* /* argv*/ [])
{
struct foo o; o.m = 0;
#ifndef FIX
o.m = malloc(sizeof( o.m )); //error:
// invalid conversion from 'void*' to 'foo::<anonymous struct>*'
#else
o.m =
(struct foo::foo_m*) //mandatory in c++
malloc(sizeof( o.m ));
#endif
return 0;
}
//#eof "$Id: rzr -- -- $"
error: reinterpret_cast from integer to pointer
error: 'constexpr' needed for in-class initialization of static data member