Skip to content

Update 02-usability.md#43

Merged
changkun merged 1 commit into
changkun:masterfrom
FrankHB:patch-2
Oct 17, 2018
Merged

Update 02-usability.md#43
changkun merged 1 commit into
changkun:masterfrom
FrankHB:patch-2

Conversation

@FrankHB
Copy link
Copy Markdown
Contributor

@FrankHB FrankHB commented Oct 17, 2018

移除可疑的冗余描述。

#41 的第二个问题中剥离。因为仍不十分清楚原意,只是回避可能引起疑问的说法;其它细节待确认。

resolve #41

移除可疑的冗余描述。
`nullptr` 出现的目的是为了替代 `NULL`。在某种意义上来说,传统 C++ 会把 `NULL`、`0` 视为同一种东西,这取决于编译器如何定义 NULL,有些编译器会将 NULL 定义为 `((void*)0)`,有些则会直接将其定义为 `0`。

C++ **不允许**直接将 `void *` 隐式转换到其他类型(换句话说,`void *` 并不属于 C++ 语言的一部分)。但如果编译器尝试把 `NULL` 定义为 `((void*)0)`,那么在下面这句代码中:
C++ **不允许**直接将 `void *` 隐式转换到其他类型。但如果编译器尝试把 `NULL` 定义为 `((void*)0)`,那么在下面这句代码中:
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

请给出 void * 在 11/14/17 中存在的具体证据。

@FrankHB FrankHB mentioned this pull request Oct 17, 2018
@FrankHB
Copy link
Copy Markdown
Contributor Author

FrankHB commented Oct 17, 2018

因为 void * 不是一个判断性陈述,不表达一条语言规则,我不理解如何判定它是否“属于 C++ 语言的一部分”。

按 ISO C++ 的核心语言规则(core language rules) ,记号组合 void * 在适当上下文中是允许出现、被实现接受(合式(well-formed) )并且具有良定义(well-defined) 的语义。据此我认为 void * 完全有理由是 C++ 核心语言的一部分,尽管这个说法不甚确切(所以删去)。

(另外, std::nullptr_t 倒不是核心语言规则定义的一部分。)

@changkun
Copy link
Copy Markdown
Owner

@FrankHB

因为 void * 不是一个判断性陈述,不表达一条语言规则,我不理解如何判定它是否“属于 C++ 语言的一部分”。

按 ISO C++ 的核心语言规则(core language rules) ,记号组合 void * 在适当上下文中是允许出现、被实现接受(合式(well-formed) )并且具有良定义(well-defined) 的语义。据此我认为 void * 完全有理由是 C++ 核心语言的一部分,尽管这个说法不甚确切(所以删去)。

(另外, std::nullptr_t 倒不是核心语言规则定义的一部分。)

如果此 PR 修复的是一个逻辑表述问题,那么 换句话说 更改为 事实上 会更加妥当。

如果我们在讨论 void * 是否属于 C++ 标准的一部分,请引用相关标准,而非使用 完全有理由 此类推断性术语。

@FrankHB
Copy link
Copy Markdown
Contributor Author

FrankHB commented Oct 17, 2018

我仍然不理解“属于”具体指的是什么,因为我能想到的各种解释都是技术上不成立和/或不着边际的。

如果单指字面上在标准原文的话,那么毫无疑问 void * “属于”标准明文要求的正式规则的一部分,并且有的出现在相当基础的核心语言规则的段落中,例如:

http://eel.is/c++draft/basic.def.odr#11.6

  • an expression that is not a null pointer constant, and has type other than cv void*, is converted to the type pointer to T or reference to T using a standard conversion, a dynamic_­cast or a static_­cast, or

再考虑 operator deletestd::memory_resource 等,void*在标准库中也是无法被绕过的。

@FrankHB
Copy link
Copy Markdown
Contributor Author

FrankHB commented Oct 17, 2018

补充:上述草案链接在 ISO C++17 对应 [basic.def.odr]/5.6 一段。

@changkun changkun merged commit bef2a8b into changkun:master Oct 17, 2018
@changkun
Copy link
Copy Markdown
Owner

非常感谢指出文中的错误!

HarrisonDing pushed a commit to HarrisonDing/modern-cpp-tutorial that referenced this pull request Feb 8, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

有关 void * 的表述

2 participants