簡體   English   中英

為什么強類型枚舉可以用沒有static_cast的整數初始化?

[英]Why can a strongly-typed enum be initialized with an integer without static_cast?

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'
}

我的編譯器是clang 4.0 ,選項為-std=c++1z

預計E e2 = 0; 不好,因為E是強類型的。 然而,讓我感到驚訝的是E e1{ 0 }; 應該可以。

為什么強類型枚舉可以用沒有static_cast的整數初始化?

從C ++ 17開始,允許使用列表初始化器查看引用

如果滿足以下所有條件,則可以使用列表初始化從沒有強制轉換的整數初始化范圍內的枚舉類型和基礎類型為固定的未范圍枚舉類型:

  • 初始化是直接列表初始化
  • 初始化列表只有一個元素
  • 枚舉是作用域或未作用域,基礎類型是固定的
  • 轉換是非縮小的

自3.9版以來,Clang支持此功能(根據實施狀態頁面

GCC從版本7開始支持此功能(根據標准支持頁面

有關其他背景和動機,請參閱此C ++提案: http//www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0138r2.pdf

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM