指针与空字符合法比较?

时间:2017-12-18 09:23:52

标签: c++

比较指向Optional<Product> product = customers.stream() .filter(c -> c.getProducts() != null && c.getProducts().getProduct() != null) .flatMap(c -> c.getProducts().getProduct().stream()) .filter(p -> p.getId().equals(productId)) .findFirst(); 的指针是否合法?

在clang ++的主干版本(25836be2c)

'\0'

给出错误:指针和整数之间的比较(&#39; const char *&#39;和&#39; int&#39;)

const char *a = "foo";

if(a == '\0')

没有按预期发出任何错误。

与空指针等效的空字符是否与指针进行比较?这是编译器错误吗?

另一点是,这个错误没有出现在&#34; -std = c ++ 03&#34;标志但显示为&#34; -std = c ++ 11&#34;旗。但是,当我使用g ++(v4.8.5)

时,我不会在这两个标准中出现错误

2 个答案:

答案 0 :(得分:5)

这是从C ++ 03到C ++ 14的变化。在C ++ 03中,[conv.ptr] p1说:

  

空指针常量是整数类型的整数常量表达式rvalue,其计算结果为零。

字符文字是一个整数常量表达式。

在C ++ 14中,[conv.ptr] p1说:

  

空指针常量是值为零的整数文字或类型为std :: nullptr_t的prvalue。

字符文字不是整数文字,也不是std::nullptr_t类型。

最初发布的C ++ 11版本不包含此更改;然而,它是由于缺陷报告DR903而引入的,并在2013年1月之后的某个时间(该DR的最后评论日期)纳入标准。

因为更改是DR的结果,编译器将其视为现有标准的错误修复,而不是下一个标准的一部分,因此Clang和GCC都会在-std=c++11时改变行为,而不仅仅是何时-std=c++14。然而,显然这种变化直到4.8版之后才在海湾合作委员会中实施。 (具体来说,它似乎只在GCC 7及以上版本中实施。)

答案 1 :(得分:4)

来自[conv.ptr]§1

  

空指针常量是值为零的整数文字或类型为std​::​nullptr_­t的prvalue。 [...]

'\0'不是整数文字,它是一个字符文字,因此转换不适用。