两个指针合法的 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 算术也可以正常编译
根据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 算术也可以正常编译