int test(unsigned int i = -1);为什么编译器不会生成警告?

时间:2016-04-06 10:52:34

标签: c++ visual-c++

默认情况下,unsigned int不能为负数。编译器会生成警告。 没关系。 但是我不清楚为什么当我在具有负默认值的函数中执行相同的操作时它不会生成警告。

unsigned int test(unsigned int i = -1) { return i;} // no warnings! Why?

int main()
{
   unsigned int i = -1;        // warning warning C4245 (ok!)
   unsigned int j = test();    // no warnings!  Why?     
}

2 个答案:

答案 0 :(得分:2)

我同意您的编译器应该警告您默认参数为负数。但编译器并不完美。 (并且标准允许将负整数值转换为无符号类型。)

关于调用 test()的警告,可怜的编译器知道 test()总是返回-1?函数的定义甚至可能在不同的编译单元中! (当然,这不是你的情况,但编制者在发出警告时不应该横向考虑。)

如果test符合constexpr,那么这将是另一回事,编译器应该能够发出警告。

答案 1 :(得分:2)

此转换为allowed without a cast,只要您准备好承担后果:

  

unsigned整数类型的对象可以转换为相应的signed类型。但是,如果无符号对象的值超出了签名类型可表示的范围,则这种转换可能会导致数据误解。

当您执行从已签名到无签名的转换时,然后返回the data will be preserved