簡體   English   中英

C++ 是否保證此 enum 與 int 構造函數重載解析?

[英]Does C++ guarantee this enum vs int constructor overload resolution?

考慮這個示例程序:

#include <iostream>

typedef enum { A, B, C } MyEnum;

struct S
{
    S(int) { std::cout << "int" << std::endl; }
    S(MyEnum) { std::cout << "MyEnum" << std::endl; }
};

S f()
{
    return A;
}

int main()
{
    S const s = f();
}

用 clang 和 gcc 編譯這會生成一個可執行文件,在運行時打印“MyEnum”。 這種行為是否由 C++ 標准保證?

是的, S::S(MyEnum)重載決議中獲勝,因為它是完全匹配的。 S::S(int)需要從 enum 到int另一個 隱式轉換整數提升)。

每種類型的標准轉換序列都被分配了三個等級之一:

  1. 完全匹配:無需轉換、左值到右值轉換、限定 > 轉換、函數指針轉換、(C++17 起)類類型到同一類的用戶定義轉換
  2. 提升:積分提升、浮點提升
  3. 轉換:整數轉換、浮點轉換、浮點轉換、指針轉換、指針到成員轉換、布爾轉換、派生類到其基類的用戶定義轉換

是的當然。 return語句允許隱式構造,而S(MyEnum)是完全匹配的。

同樣適用於return {A};

但是,如果您要使S(MyEnum)顯式,則:

  • return A; 將調用S(int)作為后備,因為MyEnum可隱式轉換為整數。 但由於額外的轉換,這比S(MyEnum)更糟糕的重載候選者,僅根據需要選擇。
  • return {A}; 表示復制列表初始化 它會失敗,因為它禁止顯式構造函數和隱式轉換。
  • return S{A}; 表示直接列表初始化,它將調用S(MyEnum) ,雖然它限制了一些隱式轉換,但它不影響這個例子,如果S(MyEnum)被刪除, S(int)將被調用。
  • return S(A); 本質上與return A;相同return A; 給定指定的返回類型S

暫無
暫無

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

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