根据优先选择节核心常量表达式( point 19),两个指针之间的减法运算符直到c++14才是合法的常量表达式。我是否可以假设以下代码是合法的c++17代码,或者这种解释是滥用的?
int X, Y;
template <long long V>
struct S { };
int main() {
S<&X - &Y> s;
(void)s;
}
发布于 2017-01-03 20:40:03
这个问题是没有意义的。指针算法只定义在属于同一数组的指针上,当然不是这种情况。因此,上面的代码是而不是 legal C++,而且实际上无法用我可以使用的编译器进行编译。
发布于 2017-01-03 20:43:12
引用的cppref 文章说
核心常量表达式是没有下列任何一项内容的任何表达式。 7)一个表达式,其计算结果导致任何形式的核心语言(自C++17以来)未定义的行为(包括有符号整数溢出、零除法、指针算法在数组边界s外)。未指定是否检测到标准库未定义的行为。(自C++17以来) 19)两个指针之间的减法运算符(直到C++14)
很可能,自c++14以来,数组边界内的数组ptr变量正在变得“合法化”,而不是所有指针算法都是合法的。
实际上,一个演示显示,即使使用c++11 (而不是c++98),数组ptr算法也可以编译。
https://stackoverflow.com/questions/41451930
复制相似问题