考虑以下代码:
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 的成员指针的转换比涉及的转换更好。
这里的情况似乎也是如此。那么为什么这个调用仍然不明确呢?