6

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

int X, Y;

template <long long V>
struct S { };

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

2 回答 2

14

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

于 2017-01-03T20:40:03.107 回答
3

引用的 cppref文章

核心常量表达式是任何不具有以下任何一项的表达式..

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

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

自 c++14 以来,可能只有数组边界内的数组 ptr 算术正在“合法化”,而不是所有指针算术


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

于 2017-01-03T20:43:12.710 回答