【问题标题】:Why does the wording for the declaration of main change between draft standards?为什么标准草案之间的主要声明措辞发生了变化?
【发布时间】:2015-02-06 15:26:08
【问题描述】:

N3936 [basic.start.main]

2 实现不应预定义main 函数。这 函数不得重载。它应该有一个声明的返回类型 类型为int,否则它的类型是实现定义的。一个 实施应允许两者

——() 的函数返回 int

——(int, 指向char的指针的函数) 返回int

N3337 [basic.start.main]

2 实现不应预定义main 函数。这 函数不得重载。它应具有类型的返回类型 int,否则它的类型是实现定义的。全部 实现应允许以下两个定义 main:

int main() { /* ...  */ }

int main(int argc, char* argv[]) { /* ...  */ }

是什么解释了这种变化?我能找到的最接近的是DR 1669,其中提议的措辞已经包含此更改。我们知道,由于“数组到指针衰减”,char* argv[] 变为 char** argv

std::cout << std::is_same<char**, std::decay<char*[]>::type>::value; // true

这并不需要重新措辞 - 它是不言自明的。那为什么要改变呢?

【问题讨论】:

    标签: c++ language-lawyer c++14


    【解决方案1】:

    一般来说它更灵活,因为它不限制语法。
    引入更改的 DR 是#1003

    main 的定义形式的规范 实施需要接受在 C99 中明确表示 参数名称和类型的确切语法形式可能会有所不同。 尽管可以合理地假设 C++ 实现会 接受类似的定义

    int main(int foo, char** bar) { /* ... */ }
    

    而不是规范

    int main(int argc, char* argv[]) { /* ... */ }
    

    使用类似于 C99 的。

    上面提到了最常见的例子:

    int main(int argc, char** argv)
    

    这并不能保证根据 C++11 工作。

    另一个例子是尾随返回类型。考虑到现在很多人专门使用它们——然后写一些类似的东西

    auto main() -> int
    

    我们希望这些以及类似的定义成为标准。不是实现定义的。

    【讨论】:

    • 就个人而言,我不会使用尾随回报类型,因为它们不会给我买任何东西。但这似乎是原因。
    • 鉴于 auto main() -&gt; intint main() 是等价的,并且旧的措辞已经被广泛认为是为了允许等价定义(特别是char**argv),我不认为这个答案真的解释它。
    • @hvd 如果它被广泛认为是次优的措辞......那将是改变它的完美理由。 DR 证实了我的推理。
    • @Columbo 对那个 DR 的引用是您的答案中缺少的内容,并且它清除了它:这不是因为旧的措辞不允许 char**argv,而是它不清楚从旧的措辞是否允许char**argv。您的回答声称旧的措辞不允许等效声明。我声称新措辞只是澄清了旧措辞的含义。
    • @hvd:相关新问题:stackoverflow.com/questions/27367400/…
    猜你喜欢
    • 2014-07-21
    • 2012-12-20
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    相关资源
    最近更新 更多