将NULL转换为long是不是很暧昧?

时间:2018-06-15 18:42:34

标签: c++ c++11

我正在尝试使用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)));
}

2 个答案:

答案 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*重载。