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是三种不同的类型,这导致重载模糊.
我的问题是,这总是保证是模糊的,因此编译错误?是否有一些规则可选择允许编译器接受此代码?是否存在一些异常但合法的整数大小组合会导致此代码编译?
甚至比您的示例更糟糕的是,所有整数转换都被平等对待.对于作为整数表达式的整数表达式的函数参数,要么类型是完全匹配,要么不是.
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含糊不清.)
| 归档时间: |
|
| 查看次数: |
168 次 |
| 最近记录: |