2017-03-15 68 views
17
enum class E 
{}; 

int main() 
{ 
    E e1{ 0 }; // ok 

    E e2 = 0; // not ok 
    // error : cannot initialize a variable of 
    // type 'E' with an rvalue of type 'int' 
} 

Derleyicim -std=c++1z seçenekli clang 4.0.Güçlü bir şekilde yazılmış bir enum, static_cast olmadan neden tamsayı ile başlatılabilir?

E, güçlü bir şekilde yazıldığından, E e2 = 0;'un iyi olmadığı beklenmektedir. Ancak, beni şaşırtan şey, E e1{ 0 };'un iyi olması.

Güçlü bir şekilde yazılmış bir enum, neden static_cast olmadan bir tamsayı ile başlatılabilir? Liste intializers kullanılarak reference bakıldığında

+3

C++ 17'den beri izin verilen [belgeler] 'e (http://en.cppreference.com/w/cpp/language/enum) göre – UnholySheep

cevap

14

C++ 17 yana izin verilir:

Hem numaralandırma türleri olan ve yatan tip sabit bir döküm olmayan bir tamsayıdan başlatıldı edilebilir unscoped numaralandırma türleri kapsamı,

direkt liste-başlatma
  • başlatıcı listesi vardır
    • başlatma edilir: aşağıdakilerden tüm doğruysa, liste başlatma kullanarak Sadece tek bir eleman
    • numaralandırma kapsamlı veya sabit altta tip unscoped, ya
    • dönüşüm
  • çınlama-olmayan daralma

    ( implementation status page göre) sürüm 3.9 itibaren bu destekler

    GCC, sürüm 7'den beri bunu desteklemektedir (standards support page numaralı telefona göre)

    Ek C içerik ve motivasyon için bu C++ teklifine bakın ation: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0138r2.pdf