Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

有关 void * 的表述 #41

Closed
FrankHB opened this issue Oct 16, 2018 · 11 comments · Fixed by #43
Closed

有关 void * 的表述 #41

FrankHB opened this issue Oct 16, 2018 · 11 comments · Fixed by #43
Labels

Comments

@FrankHB
Copy link
Contributor

FrankHB commented Oct 16, 2018

在某种意义上来说,传统 C++ 会把 NULL、0 视为同一种东西,这取决于编译器如何定义 NULL,有些编译器会将 NULL 定义为 ((void*)0),有些则会直接将其定义为 0。

且不论“编译器”定义 NULL 的说法来源是什么,“传统 C++”是指 ISO C++ 之前的(如由 Annotated Reference Manual 定义的) C++ 还是 ISO C++11 以前的 C++ ?指代不明。

注意 http://eel.is/c++draft/support.types.nullptr#footnote-187 是在什么时候引入的,烦请重新校对内容质量。

隐式转换到其他类型(换句话说,void * 并不属于 C++ 语言的一部分)

依据?

@changkun
Copy link
Owner

changkun commented Oct 16, 2018

指代不明。

请养阅读序言的习惯,一般在此会介绍一些书中的用语约定。

依据?

请不要断章取义,在引用时不要忘记加入「不允许隐式转换」,如果对书中的解释不满意,请善用搜索:

@changkun
Copy link
Owner

changkun commented Oct 16, 2018

补充:

烦请重新校对内容质量

老实说笔者目前没有时间维护此项目,短期内不会有更新。此项目最初写于笔者许多年前攻读学士时期,如遇错误百出实属自然。如若对内容感到不满,您有两个选择:

  1. 非常欢迎您创建一个 issue,提交一个 PR,修复您提交的 issue,让这个教程变得更好;
  2. 重新选择其他能令您满意的教程。

@Sunchy321
Copy link

不允许 implicit cast 和是不是该语言的一部分有何关系。。

@akemimadoka
Copy link

akemimadoka commented Oct 17, 2018

不过事实上 void* 可以隐式转换到 bool,猜测作者的意思是不能隐式转换到除 cv void* 以外的其他指针类型

@FrankHB
Copy link
Contributor Author

FrankHB commented Oct 17, 2018

请养阅读序言的习惯,一般在此会介绍一些书中的用语约定。

确有表达过略而引起这里的误会的因素,遂略作补充。

“传统 C++”(“传统”和“现代”相对,应该就是 traditional C++ ,虽然 Preface 页对应的英文版现在还不存在) 在一般语境中确实不像是被普遍已经定义了的固定搭配(而不是像“传统 C”那样约定俗成另有不同指涉,如[1][2]),所以在序言中补充定义通常并无问题。尽管如此,这里的传统 C++ 的说法只能按如“传统 C” 那样的 pre-standard 来解释变通,否则下文和所给链接中的内容直接矛盾(最近没有修改,和正式 ISO C++ 标准中的文本一致,即便是 informative text )。因为不理解作者的原意而不便直接修改提 PR ,这是针对这一段提 issue 的原因之一。

老实说笔者目前没有时间维护此项目,短期内不会有更新。

建议明示项目状态以便帮助改进。

请不要断章取义

这里并非取义问题,而是一定程度上断章不够明确。实际上,引文的原意关注的只是括号中的逗号右边的部分,即“void * 并不属于 C++ 语言的一部分”的含义(不够明确而看起来有问题);括号前的内容作为引文的上文便于参考,表示即便加上上文之后也难以理解含义。“不允许”这一句子成分残缺的确可能引起关注点的误解,但是没有实质改变这个问题,反而加重了读者的困惑:如上面有用户指出的,“不允许 implicit cast 和是不是该语言的一部分有何关系”(按引文的原话对应的则是“implicit cast 和是不是该语言的一部分有何关系)。

@FrankHB
Copy link
Contributor Author

FrankHB commented Oct 17, 2018

部分修改已创建 PR (尽管关于这里提到的问题我不认为是 editorial 的,需要确认)。

关于可能出错的问题,可能需要系统性检查,建议创建类似 #2 的 meta issue (因该 issue 标记为 enhancement ,似不便直接涵盖)。

@jovany-wang
Copy link

对于疑问,提出issue来讨论是很正常的流程。

@changkun changkun reopened this Oct 17, 2018
@changkun changkun changed the title NULL 有关 NULL 的表述 Oct 17, 2018
@jovany-wang
Copy link

隐式转换到其他类型(换句话说,void * 并不属于 C++ 语言的一部分)
对于这部分内容,其实在官方文档中应该就可以确定 void *是否属于语言一部分。

@FrankHB
Copy link
Contributor Author

FrankHB commented Oct 17, 2018

@jovan-wong 提出 issue 是一种常用的手段,但如何适用跟具体项目约定的规则有关。例如,ISO C++ 草案按照规则判定适合直接提出 PR 或者 issue 讨论的 editorial issue 。更复杂的问题通过会议和其它流程讨论解决。

本项目中我没有找到其它详细指引,因此按 GitHub 用户的惯例在当前和主题最相关的 issue 中展开讨论。

关于 void * 的具体问题和我认为可能如何修改合适的原因,暂时移至更具体的 #43 讨论。

@changkun
Copy link
Owner

changkun commented Oct 17, 2018

@FrankHB

这里的传统 C++ 的说法只能按如“传统 C” 那样的 pre-standard 来解释变通

学术写作中一般以作者约定为准,作者为了方便文中表述,会提前对相关术语进行约定,不一定与习惯用语相同,笔者对中文流行用语不太熟悉,本书主要讨论 C++11/14/17,故约定标准正式之前的均为传统。

不过为了避免歧义,倒是可以总结补充术语表在附录中进行进一步说明。

如上面有用户指出的,“不允许 implicit cast 和是不是该语言的一部分有何关系”(按引文的原话对应的则是“implicit cast 和是不是该语言的一部分有何关系)。

此前对本章节有过一次小规模的修订,没有仔细审查此表述的正确性,如若有误请查阅相关标准加以证明,非常感谢。

@changkun
Copy link
Owner

隐式转换到其他类型(换句话说,void * 并不属于 C++ 语言的一部分)
对于这部分内容,其实在官方文档中应该就可以确定 void *是否属于语言一部分。

烦请给出 C++11/14/17 标准中具体章节中表述的证明。

@changkun changkun changed the title 有关 NULL 的表述 有关 void * 的表述 Oct 17, 2018
@changkun changkun added bug and removed discussion labels Oct 17, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants