NOEMBLEM/エンブレムが設定されていません。

メールの詳細(トピック表示)

auto main() { ... } の型は?

投稿者:επιστημηさん  2013/12/02 05:50  MLNo.14084   [メール表示]

επιστημηです。

C++14の 関数戻り値の型推論 により、auto f() { return 3.14; } // double f() {
... }
とか書けます。

"main() は return 0; を省略できる"ルールにより、
auto main() {} は int main() { /* 隠れたreturn 0; */ } となるのがスジやと思
うのですが、
Visual C++ Compiler November 2013 CTP では
void main() と思ってらっしゃるみたい。

規格としてはどっちが正しいのでしょうか?


このエントリーをはてなブックマークに追加


  • MLNo.14085   "k.tsumura"さん  (0) 2013/12/02 09:12  [メール表示する]
    zakです。

    §3.6.1 p5
    (snip)
    If control reaches the end of main without encountering a return statement, the effect is that of executing
    return 0;

    とあるので、「隠れたreturn 0;が埋め込まれる」のではなく、「0が返されるようにふるまう」(std::exit(0)を呼ぶ)と解釈するのではないでしょうか。
    とするなら、コンパイラの解釈として、"return文がない関数はvoidを返すものと推論する"結果として、int (*)(void)型になるのは妥当だと思います。

    # 余談
    §3.6.1 p2
    (snip)
    It shall have a return type of type int, but otherwise its type is implementation-defined. All implementations shall allow both of the following definitions of main:
    int main() { /* ... */ }
    and
    int main(int argc, char* argv[]) { /* ... */ }

    にあるとおり、int main() / int main(int, char*) 「以外の形式は実装依存」なので、auto main(){}をgcc/clangでやると怒られます。おなじくvoidを返すように推論しているようです。

  • MLNo.14086   "k.tsumura"さん  (0) 2013/12/02 09:21  [メール表示する]
    zak です

    typo:
    > とするなら、コンパイラの解釈として、"return文がない関数はvoidを返すものと推論する"結果として、int (*)(void)型になるのは妥当だと思います。
    s/int (*)(void)/void (*)(void)/g

  • MLNo.14087   επιστημηさん  (0) 2013/12/02 10:14  [メール表示する]
    επιστημηです。

    > If control reaches the end of main without encountering a return
    statement,
    > the effect is that of executing return 0;
    >
    > とあるので、「隠れたreturn 0;が埋め込まれる」のではなく、「0が返されるよ
    > うにふるまう」(std::exit(0)を呼ぶ)と解釈するのではないでしょうか。

    なるほど、"the *effect* is that of executing return 0;" ですか。
    それならわかるです。

    > auto main(){}をgcc/clangでやると怒られます。おなじくvoidを返
    > すように推論しているようです。

    これとも合致するですね。


メールへの返信はMLのメンバーしかできません。

更新順メールリスト