我正在尝试使用NULL与nullptr的用法。 由于NULL可以转换为整数类型,因此下面的示例应该显示模糊性,但它不是!!
它显示了模糊的候选编译错误,如果它是无符号长整数,而不是有符号长整数。
有人可以解释为什么!!
static void updateBorder(JTextField textField,
Icon icon) {
Border iconBorder = new AbstractBorder() {
private static final long serialVersionUID = 1;
@Override
public Insets getBorderInsets(Component c,
Insets insets)
{
insets.left = icon.getIconWidth() + 4;
insets.right = insets.top = insets.bottom = 0;
return insets;
}
@Override
public void paintBorder(Component c,
Graphics g,
int x,
int y,
int width,
int height)
{
icon.paintIcon(c, g,
x, y + (height - icon.getIconHeight()) / 2);
}
};
Border oldBorder = textField.getBorder();
// Inside text field's original border, place icon border
// with a little empty space around it.
textField.setBorder(BorderFactory.createCompoundBorder(
oldBorder,
BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(2, 2, 2, 2),
iconBorder)));
}
答案 0 :(得分:11)
在C ++中,NULL
被定义为整数类型。您的编译器可能将其定义为long
,因为它匹配该重载。 C ++标准明确声明 (草案N3936,第444页) :
宏NULL的可能定义包括0和0L,但不包括(void *)0。
这种限制是必要的,因为例如char *p = (void*)0
是有效的C但是C ++无效,而char *p = 0
在两者中都有效。
答案 1 :(得分:7)
由于
NULL
可以转换为整数类型,它应该显示含糊不清,下面的示例,但它不是!!
NULL
的问题,这是引入nullptr
的动机原因之一,是你真的不能说应该的行为方式。有许多不同的方法可以定义NULL
,并且根据定义的选择,你可以在这里有不同的行为 - 它可能导致后面的两个函数中的任何一个被称为或暧昧。在不知道供应商如何定义宏的情况下,您无法说出来。
关于nullptr
的好处是它毫无疑问会调用int*
重载。