当前位置: 首页 > 知识库问答 >
问题:

是否可以在 constexpr 上下文中使用使用导致未指定(不是未定义!)行为的指针的表达式?

滑骞尧
2023-03-14

根据 cpp 偏好(强调我的):

核心常量表达式是指在任何子表达式中不包含以下任何一项的任何表达式...)

另一方面,指针上有几个表达式的结果不是未定义的,而是未指定的(参见[expr.rel]/3),例如:

struct A {
    int v;
};

struct B {
    int v;
};

struct C: A, B {} c;

int main() {
    constexpr bool result = &c.A::v < &c.B::v;
    (void)result;
}

代码编译时没有 gcc 的问题,但不是 clang 的编译,它陈述了毫无疑问是正确的:

不同基类的子对象的地址比较有未指定的

但是(据我理解)根据cppreference,它不应该阻止编译器编译代码。

哪个编译器是正确的- gcc还是clang?我是否过度解读了cppreference?

共有1个答案

公西鸿博
2023-03-14

除了关于UB的包罗万象的情况之外,[expr.const]中禁止表达的列表的末尾是,

-结果未指定的关系或等号操作符

这也出现在cp首选项列表中,当前编号为#19。

 类似资料:
  • 考虑以下C程序: null 访问易失性对象、修改对象、修改文件,或者调用执行那些操作中的任何操作的函数都是副作用,它们是执行环境状态的改变。表达式的计算通常包括值计算和副作用的启动。用于lvalue表达式的值计算包括确定指定对象的标识。 Sequenced before是单线程执行的计算之间的非对称、传递、成对关系,它导致这些计算之间的部分顺序。给定任意两个评价A和B,如果A排序在B之前,那么A的

  • 一位博客作者提出了关于空指针解引用的讨论: http://www.viva64.com/en/b/0306/ 我在这里提出了一些反驳意见: http://bit.ly/1L98GL4 他引用标准的主要推理是这样的: 的” C99标准说了以下关于” 一元的操作数 表达'podhd- 如果将空指针常量转换为指针类型,那么得到的指针(称为空指针)肯定不等于指向任何对象或函数的指针。 当“左值在计算时不指

  • 这段引文包括一个非规范性脚注: 不是数组元素的对象为此被认为属于单元素数组;见8.5.2.1 其中引用了8.5.2.1[expr.unary.op],讨论了一元运算符:

  • 问题内容: 我正在尝试使用jQuery在特定端口上运行AJAX查询: 这不起作用:没有进行AJAX调用,并且Firebug中没有任何异常。如果我不指定端口,它确实可以工作。有人知道为什么吗? 问题答案: 由于“ 同源来源”政策而无法使用。仅在相同的域,协议和端口中才允许AJAX请求。 如果您确实需要从该来源获取数据,则应该期待JSONP。

  • 主要内容:定义指针变量,通过指针变量取得数据,关于 * 和 & 的谜题,对星号*的总结数据在内存中的地址也称为 指针,如果一个变量存储了一份数据的指针,我们就称它为 指针变量。 在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。指针变量的值就是某份数据的地址,这样的一份数据可以是数组、字符串、函数,也可以是另外的一个普通变量或指针变量。 现在假设有一个 char 类型的变量 c,它存储了字符 'K'(ASCII码为十进制数 75),并占用了地址为 0X11A 的内存(地址