[英]Enums, Constructor overloads with similar conversions
當我將enum指定為第二個參數時,為什么VisualC ++(2008)會混淆“C2666:2重載具有類似的轉換”,但是當我定義bool類型時卻沒有?
不應該鍵入匹配已排除第二個構造函數,因為它是'basic_string'類型?
#include <string>
using namespace std;
enum EMyEnum { mbOne, mbTwo };
class test {
public:
#if 1 // 0 = COMPILE_OK, 1 = COMPILE_FAIL
test(basic_string<char> myString, EMyEnum myBool2) { }
test(bool myBool, bool myBool2) { }
#else
test(basic_string<char> myString, bool myBool2) { }
test(bool myBool, bool myBool2) { }
#endif
};
void testme() {
test("test", mbOne);
}
我可以通過指定引用來解決這個問題。 basic_string&myString'但不是'const basic_string&myString'。
也通過“test((basic_string)”test“,mbOne”顯式調用;“ 也有效。
我懷疑這與通過固有的'!= 0'解析為bool的每個表達式/類型有關。
好奇的評論都一樣:)
模糊性的原因是,只有當一個候選函數的參數都不比另一個參數更差時,它才優於另一個候選函數。
問題是字符串文字,其類型為const char[5]
可以轉換為std::string
(通過轉換構造函數)和bool
(因為數組可以衰減為指針,任何指針都是可以隱含地轉換為bool
)。 轉換為bool
是首選,因為它是標准轉換,標准轉換優先於用戶定義的轉換。
所以,考慮“破壞”的重載:
test(basic_string<char> myString, EMyEnum myBool2) { } // (1)
test(bool myBool, bool myBool2) { } // (2)
第一個參數是const char[5]
並且更喜歡(2)
(根據上面的描述)。 第二個參數是EMyEnum
並且更喜歡(1)
,這是完全匹配; 匹配(2)
需要轉換(枚舉可以隱式轉換為bool
)。
現在考慮第二種情況:
test(basic_string<char> myString, bool myBool2) { } // (3)
test(bool myBool, bool myBool2) { } // (4)
第一個參數仍然更喜歡(4)
,但現在第二個參數可以同等地匹配(3)
和(4)
。 因此,編譯器可以選擇(4)
並且沒有歧義。
如果你消除了第一個參數所需的轉換,就沒有歧義,例如,
test(basic_string<char>("test"), mbOne);
因為兩個參數都完全匹配(1)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.