用(un)签名的chars重载函数,传递char,是不是要编译?

Nei*_*irk 4 c++ language-lawyer

以下代码将无法在我的编译器上编译.我理解为什么.

void f(signed char x);
void f(unsigned char x);

int main()
{
    char c = 0;
    f(c);
}
Run Code Online (Sandbox Code Playgroud)

signed char,unsigned char并且char是三种不同的类型,这导致重载模糊.

我的问题是,这总是保证是模糊的,因此编译错误?是否有一些规则可选择允许编译器接受此代码?是否存在一些异常但合法的整数大小组合会导致此代码编译?

Pot*_*ter 5

甚至比您的示例更糟糕的是,所有整数转换都被平等对待.对于作为整数表达式的整数表达式的函数参数,要么类型是完全匹配,要么不是.

void f( short ) {}
void f( long ) {}

int main() {
    f( 1000000 ); // Ambiguous, even though one alternative loses numeracy.
}
Run Code Online (Sandbox Code Playgroud)

找不到最佳参数 - 参数匹配的[over.ics.rank]规则中没有考虑整数转换等级.即使有,这三种char类型也需要具有相同的等级.


甚至比我的例子更糟糕的是,即使参数根本无法初始化两个备选方案中的一个,呼叫也可能是模棱两可的.

void f( short ) {}
void f( long ) {}

int main() {
    f({ 1000000 }); // Ambiguous, even though narrowing to short is prohibited.
}
Run Code Online (Sandbox Code Playgroud)

标准似乎没有规范性要求,我正在考虑提交缺陷报告.(§13.3.3.1.5/ 9.1含糊不清.)