Statik_dosyası kullanarak constexpr bağlamında bir üye işaretçisinin yayınlanmasıyla g ++ ile ilgili bir problemle karşılaştım. Kod örneğine bakınız.static_cast üyesinin üyesidir. Static_cast consextpr bağlamında g ++ üzerinde
g ++ sürüm 6.3 ve 7.0 ile derlerken, reinterpret_cast ifadesinin sabit bir ifade olmadığını belirten bir derleme hatası verir. Clang sürüm 4.0 hata verirken, burada bir reinterpret_cast olmadığından doğru olduğunu düşünüyorum.
Bu bir g ++ veya clang hatası mı? Doğru davranış nedir? Oyunculara izin ve notlar
struct Base {};
struct Derived : Base
{
int i;
};
struct Ptr
{
constexpr Ptr(int Derived::* p) : p(static_cast<int Base::*>(p)){}
int Base::* p;
};
constexpr Ptr constexpr_ptr(&Derived::i);
Derleyici çıkış
g++ -c -std=c++14 test.cpp
test.cpp:17:40: in constexpr expansion of ‘Ptr(&Derived::i)’
test.cpp:11:41: error: a reinterpret_cast is not a constant expression
constexpr Ptr(int Derived::* p) : p(static_cast<int Base::*>(p)){}
^~~~~~~~~~~~~~~~~~~~~~~~~~~
Bu gerçekten bir yayın değil. –