gpt4 book ai didi

c++ - 具有类似转换的枚举、构造函数重载

转载 作者:太空狗 更新时间:2023-10-29 20:48:36 24 4
gpt4 key购买 nike

当我将枚举指定为第二个参数时,为什么 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)

关于c++ - 具有类似转换的枚举、构造函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2926138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com