【问题标题】:Isn't the note below a contradiction in relation to paragraphs (2.1) and (2.2) in [basic.start.main]/2?下面的注释与 [basic.start.main]/2 中的 (2.1) 和 (2.2) 段是否矛盾?
【发布时间】:2018-11-23 18:52:54
【问题描述】:

[basic.start.main]/2:

实现不应预定义主要功能。这个功能 不得超载。其类型应具有 C++ 语言链接和 它应该有一个声明的 int 类型的返回类型,否则它的 类型是实现定义的。一个实现应允许两者

(2.1) () 返回int
(2.2) 一个函数(int,指向char)的指针返回int

作为main的类型 ([dcl.fct])。在后一种形式中,为了说明,第一个 函数参数称为argc,第二个函数参数是 称为argv,其中argc 是传递给 程序运行环境中的程序。如果argc 是 非零这些参数应通过argv[0] 提供 argv[argc-1] 作为指向以空字符结尾的初始字符的指针 多字节字符串 (NTMBSS) ([multibyte.strings]) 和 argv[0] 应为 指向 NTMBS 的初始字符的指针,它表示 用于调用程序的名称或""argc 的值应为 非负的。 argv[argc] 的值应为0。 [ 注意:是 建议在之后添加任何其他(可选)参数 argv。 — 尾注 ]

【问题讨论】:

  • 它说一个实现应该允许两者,但不仅仅是两者。
  • 你为什么觉得这很矛盾?
  • 请具体说明您认为矛盾的具体内容。我不清楚你如何解释引用中提到的部分。

标签: c++ language-lawyer


【解决方案1】:

它规定至少必须允许两个签名; int main()int main(int, char**)

允许的其他类型是实现定义的。

他们建议,如果您的实现允许main 带有更多 个参数,则将它们添加到该特定签名的int, char** 参数之后。这不是强制的。

实现可以说这是一个有效的main签名:

int main( std::vector<std::string> args )

或者它可能有:

int main( int, char**, system::permission_token )

或其他。

第二个——system::permission_token——这是一个可选参数(即int main(int, char**) 仍然有效),将是注释所建议的。第一种样式仍然是允许的。

【讨论】:

  • 引用“但否则它的类型是实现定义的”可以很好地引用函数的返回类型,而不是其他参数。至少这是我的解释。
  • @WaldB 当然,你看错了。 but 子句并未从短语的第一部分删除“shall”要求。函数的类型包括它的返回值、它的参数以及(在 C++ 的更高版本中)是否为 noexcept。所有main 函数必须返回int(句子的第1 部分),但其他一切都是关于其类型的实现定义(句子的第2 部分)。然后它继续进一步限制实现可以定义的内容(说它必须支持两个不同的签名,而不是将其限制为支持这两个)。
  • 我会说你之前的评论对我来说很有意义。但我不同意任何人(包括以英语为母语的人)只要阅读标准就可以得出这个结论。
  • @WaldB 也许“应该”在 ISO 标准中具有非常特殊的含义这一事实可能会让您感到困惑。
  • 你能评论一下这个具体的含义吗?
猜你喜欢
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
  • 2012-08-23
相关资源
最近更新 更多