两个指针合法的 c++17 常量表达式之间的区别是什么?

Is difference between two pointers legal c++17 constant expression?

根据cppreference部分核心常量表达式19)两个指针之间的减法运算符不是合法的常量表达式直到 c++14。我可以假设以下代码是合法的 c++17 代码还是这种解释是一种滥用?

int X, Y;

template <long long V>
struct S { };

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

这个问题没有实际意义。指针算法只定义在属于同一个数组的指针上,当然不是这样。所以,上面的代码 不是 合法的 C++,事实上,无法使用我可用的编译器进行编译。

引用的 cppref article

A core constant expression is any expression that does not have any one of the following ..

7) An expression whose evaluation leads to any form of core language (since C++17) undefined behavior (including signed integer overflow, division by zero, pointer arithmetic outside array bounds, etc). Whether standard library undefined behavior is detected is unspecified. (since C++17)

19) a subtraction operator between two pointers(until C++14)

自 c++14 以来,可能只有数组边界内的数组 ptr 算术得到 'legalized',并非所有指针算术


实际上 demo 表明即使使用 c++11(不是 c++98),数组 ptr 算术也可以正常编译