【问题标题】:Is difference between two pointers legal c++17 constant expression?两个指针之间的区别是合法的c ++ 17常量表达式吗?
【发布时间】:2017-01-03 20:37:09
【问题描述】:

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

int X, Y;

template <long long V>
struct S { };

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

【问题讨论】:

    标签: c++ language-lawyer c++17 constant-expression


    【解决方案1】:

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

    【讨论】:

    • 或者两个空指针IIRC,当然也不是这样。
    • 所以我过度解释了措辞?是的,我也对其进行了测试,但我了解到在给定的编译器中没有编译的事实并不意味着它实际上是不合法的,因此问题:)
    • @hvd,我不记得关于减法的空指针有任何异常,但我的记忆可能会让我失望。您能提供报价吗?
    • @W.F.,虽然编译器确实可能存在错误,但当多个编译器就某事达成一致时,强烈暗示您是错误的人:-P
    • @W.F.这是 c++14 后的 DR 1313(现在在 cppreference 页面底部注明)
    【解决方案2】:

    引用的 cppref article

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

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

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

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


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 2010-12-16
      • 2020-06-07
      • 2016-08-05
      • 2019-08-22
      相关资源
      最近更新 更多