【问题标题】:Is &*NULL well-defined in C++?&*NULL 在 C++ 中定义良好吗?
【发布时间】:2019-01-12 10:45:00
【问题描述】:

在哪个版本的 C++ 标准(如果有)中明确定义了以下内容?

void foo(void) {
    char *nullPtr = NULL;
    &*nullPtr;
}

请注意,我在这里专门询问&*nullPtr。我知道只是 *nullPtr 是未定义的 - 但这是一个单独的问题,因此当前链接的“重复”不是重复的。

请注意,我没有将结果分配给任何东西 - 第二行是一个简单的语句。

这个应该是一个有明显答案的问题,但是(在此类问题上似乎经常发生)我听到的答案与“显然未定义”一样多定义”。

在一个相当相关的说明中,以下内容呢? foo 应该读取 c 吗?

extern volatile char c;

void bar(void) {
    volatile char *nonnullptr = &c;
    &*nonnullptr;
}

(同题C版:Is &*NULL well-defined in C?

【问题讨论】:

  • 选择一种语言。 Language-lawyer 和 C/C++ 通常不会一起使用,因为 C 和 C++ 是完全不同的语言。也就是说,在 C 中取消引用空指针会导致未定义的行为,但 &*E is equivalent to E even for null pointers.
  • 我想知道两者。您是说创建两个单独的问题会更好吗?
  • 对我来说这似乎是最好的,因为这个问题是关于语言律师对两种不同语言的挑剔(其他人可能不同意)。但是我不确定这两种语言是否在这个问题上达成一致;他们可能是。
  • @DavidBowling - 我已经这样做了;谢谢。见link
  • @Ben-Voigt - 链接的问题涉及 *NULL,而我问的是 &*NULL。这是两个不同的问题。 (请注意,例如,在 C 中,前者是未定义的,而后者是已定义的。)。因此,链接的问题回答我的问题。

标签: c++ language-lawyer


【解决方案1】:

这是四题合一。


&*nullPtr 自 C99 以来在 C 中定义良好,其中提到了一元 & 运算符:

如果操作数是一元 * 运算符的结果,则 运算符和 & 运算符都被评估,结果就像两者一样 被省略了,[...]

请参阅 WG14 N721DR076


&*nullPtr 在所有 C++ 版本中都没有正式定义(省略:一元 & 被指定为生成指向“指定对象”的指针,而一元 * 被指定为生成“一个左值引用object [...] 表达式指向的对象”;一个空指针值不指向任何对象),尽管 core issue 232 的方向是为了使其明确定义。


&*nonnullptr 不会产生对*nonnullptr 的易失性读取。一元 & 需要一个左值操作数; *nonnullptr 不执行左值转换(对于 C)或左值到右值转换(对于 C++)。

【讨论】:

  • 在@DavidBowling 的建议下,我将其分为 C 和 C++ 问题。
  • 这……很有趣。所以换句话说,在 C++ 中,它 is 是出于 UB 的目的而取消引用,但 isn't 是出于 volatile 的目的?是的一致性。
  • Core Issue 232 提出空引用,13 年没有更新了……看来直接是目前“无处可去”
  • @M.M 我的理解是 CWG 有太多其他更高优先级的项目。
猜你喜欢
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
相关资源
最近更新 更多