[英]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++ 標准保證?
是的當然。 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.