C++17常量表达式中,两个指针之间的差异是否合法?

6
根据cppreference核心常量表达式部分第19点,两个指针之间的减法运算符在之前不是合法的常量表达式。我可以假设以下代码是合法的代码吗?或者这种解释是滥用的吗?
int X, Y;

template <long long V>
struct S { };

int main() {
    S<&X - &Y> s;
    (void)s;
}
2个回答

14

这个问题并没有意义。指针算术运算只适用于属于同一数组的指针,而在这种情况下,这显然不成立。因此,上面的代码不是合法的C++代码,事实上,在我可以使用的编译器中无法编译。


1
所以我过度解释了措辞?是的,我也测试过了,但我学到的是,在给定编译器中某些东西无法编译并不意味着它实际上是不合法的,因此有疑问 :) - W.F.
@W.F.,虽然编译器可能会有错误,但当几个编译器都同意某件事时,这是一个强烈的暗示,你可能是错的 :-P - SergeyA
@SergeyA https://dev59.com/QGsz5IYBdhLWcg3wFT4f is easier to find for me than the quote in the standard :) - user743382
@SergeyA 我同意,不过这是C++17,理论上编译器还没有完全支持它 ;) :-P - W.F.
1
@W.F. 这是 C++14 DR [1313] 的帖子(现在已在 cppreference 页面底部注明)。 - Cubbi
显示剩余3条评论

3

引用的cppref 文章 表明:

核心常量表达式是指不具有以下任何一种情况的表达式..

7) 评估会导致任何形式的核心语言(自C++17起)未定义行为(包括有符号整数溢出、除以零、数组边界外的指针算术等)。检测是否存在标准库未定义行为是未指定的。(自C++17起)

19) 两个指针之间的减法运算符(直到C++14)

很可能只有在c++14中才将数组指针算术“合法化”,而不是所有指针算术


实际上,演示显示,即使在c++11(而不是c++98)中,数组指针算术也可以编译正常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接