重载构造函数之间的歧义

Mun*_*nro 5 c++ templates

有人可以向我解释为什么在下面的代码中,如果我尝试实例化MyFooC,我会对Foo中的重载构造函数进行模糊调用吗?我的假设是用作构造函数参数的整数将被提升为unsigned int并已解决,但这显然是不正确的.

template <typename t> class Foo
{
private:
    t m_Value;
    unsigned int m_Length;

public:
    Foo(const t& Value) :
        m_Value(Value),
        m_Length(0)
    {
    }

    Foo(unsigned int Length) :
        m_Value(static_cast<t>(0)),
        m_Length(Length)
    {
    }
};

int main()
{
Foo<double> MyFooA(32U);
Foo<double> MyFooB(32.0f);
//Foo<double> MyFooC(32);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*nze 10

一个int可以转换为a double和a unsigned; 两者都被视为"扩大"转换,并具有相同的排名.作为一般规则,任何时候你重载,并且其中一个重载是一个整数类型int,当你有人试图传递一个积分时,最好还是重载,确保得到你想要的东西,并避免歧义.不变.

顺便说一句:虽然在上下文中很清楚你的意思,但在C++标准中,"促销"具有非常精确的含义,并且不包括转换intunsigned int.