两个指针之间的差异是合法的 c++17 常量表达式

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

本文关键字:c++17 表达式 常量 两个 指针 之间      更新时间:2023-10-16

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

int X, Y;
template <long long V>
struct S { };
int main() {
    S<&X - &Y> s;
    (void)s;
}

这个问题没有实际意义。指针算术仅在属于同一数组的指针上定义,这当然不是这种情况。因此,上面的代码不是合法C++,实际上无法使用我可用的编译器进行编译。

引用

的cppref文章说

核心常量表达式是没有任何 以下之一..

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

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

自 c++14 以来,可能只有数组边界内的数组 ptr 算法被"合法化",并非所有指针算法


实际上,一个演示表明,即使使用 c++11(不是 c++98),数组 ptr 算术也能很好地编译。