为什么这个函数调用不明确,转换为 bool 需要额外的步骤?

问题描述 投票:0回答:1

考虑以下代码:

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 的成员的指针是 比那个更好。

这里的情况似乎也是如此。那么为什么这个调用仍然不明确?

c++ pointers type-conversion function-pointers implicit-conversion
1个回答
1
投票

这两个转换序列都是用户定义的转换序列。

包含不同构造函数/转换函数的用户定义的转换序列始终被认为是不明确的,无论序列中的其他标准转换的等级是否不同。

© www.soinside.com 2019 - 2024. All rights reserved.