2017-10-18 16 views
11

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)){} 
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+1

Bu gerçekten bir yayın değil. –

cevap

3

GCC muhtemelen yanlış anlayıp [expr.static.cast]/12, o

sınıf B orijinal üyesini içeren ya da bir baz veya türetilmiş sınıf ise Orijinal üyeyi içeren sınıf, sonuçtaki işaretçi, orijinal üyeye üye noktalarıdır. Aksi halde davranış tanımsızdır. Base yana

, davranış tanımlanmalıdır gerçekten elemanı içeren sınıfın bir baz ve yapıcı bir sabit ifade arayın.