Visual C ++ Literal 0整数

时间:2016-02-24 00:12:27

标签: c++-cli

我当前有0U作为函数的参数,它导致“警告C4965:整数0的隐式框;使用nullptr或显式强制转换”。此警告假设我使用0U表示nullptr;但是,我试图将0U实际用作无符号零值整数。我发现的所有帮助都建议如何将0U投射到nullptr但不反过来。建议?

String::Format("{0}", 0U);

1 个答案:

答案 0 :(得分:1)

String :: Format为格式字符串(第一个参数)之后的参数接受object类型的参数。由于0或0U都是结构体,因此它们将被隐式装箱为对象类型,因为这是参数的类型。在你的情况下,隐式装箱也不错,因为代码无论如何都必须将它装箱,并且你明确地装箱它​​将需要更多的代码。

考虑到通常你会"0"而不是String::Format("{0}", 0),你的例子有些奇怪。通常你有一个参考引用和绕过隐含的盒子警告,你会在它上面调用ToString(这就是String :: Format在内部会做什么)以避免额外的装箱。

所以下面的内容应该给出警告,因为你正在将一个struct传递给一个需要一个对象的参数,所以struct会被隐式装箱

int x = 0;
String::Format("{0}", x);

为了摆脱隐含的拳击,我通常会这样做

int x = 0;
String::Format("{0}", x.ToString());

这会将String传递给函数,字符串是引用类型,因此不需要加框。在上面给出的情况下避免隐式装箱确实有助于提高性能,因为你可以避免隐式装箱操作。