比较指向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)
时,我不会在这两个标准中出现错误答案 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)