考虑以下代码:
struct Foo
{
typedef bool (*fptr_t)(int);
operator fptr_t() const
{
return _func;
}
fptr_t _func;
};
class Wrapper
{
public:
Wrapper(const Foo&) {}
};
void foo(bool b)
{
}
void foo(Wrapper w)
{
}
int main()
{
Foo f;
foo(f);
}
编译时不会出现“对重载函数的模糊调用”错误。 在我看来,两个
foo
重载都需要用户定义的转换。但是对于 Wrapper
版本,转换会进行
Foo->(user-defined conversion)Wrapper = exact match
而对于
bool
版本,转换进行
Foo->(user-defined conversion)fptr_t->(implicit conversion)bool = exact match
这需要额外的步骤。此外,cppreference 指出(虽然我找不到标准的确切段落)
如果两个转换序列无法区分,因为它们具有 相同等级,适用以下附加规则: 1) 转换 不涉及指向 bool 的指针或指向 bool 的成员的指针是 比那个更好。
这里的情况似乎也是如此。那么为什么这个调用仍然不明确?
这两个转换序列都是用户定义的转换序列。
包含不同构造函数/转换函数的用户定义的转换序列始终被认为是不明确的,无论序列中的其他标准转换的等级是否不同。