2

私はこの非常に単純なコードを持っています:

 constexpr int main()
 {
    return 0;
}

C++ 11標準N3485から、それが違法であることを理解しています:

関数 main は、プログラム内で使用してはなりません。main のリンケージ (3.5) は実装定義です。 main を削除済みとして定義するプログラム、または mainを inline、static、またはconstexpr であると宣言するプログラムは整形されていません。 名前 main は予約されていません。

gcc 4.7.2 を使用して実行すると。次のエラーが出力されます。

prog.cpp:1:20: error: cannot declare ‘::main’ to be inline

一方、関数本体から を削除すると、return 0から return ステートメントが欠落しているという警告さえ出さずに同じエラーが報告されmainます。

これは gcc 4.7.2 のバグですか? constexprと報告されるのはなぜinlineですか? 2 番目の現象は、return ステートメントを入れなくてもよいということですか、mainそれとも、return ステートメントを入れなくてもデフォルトreturn 0なのでしょうか (これは悪い習慣だとわかっています)。

ありがとうございました。

4

1 に答える 1

9

main()returnステートメントを省略できる唯一の値を返す関数です。何も返さずに終了するmain()ことは、返すことと同じです0(他の関数については未定義の動作です。6.6.3/2 を参照してください)。

C++11 標準のパラグラフ 3.6.1/5 によると:

returnステートメント in には、関数を終了し (自動保存期間を持つすべてのオブジェクトを破棄する) 、戻り値を引数として呼び出すというmain効果があります。ステートメントに遭遇せずに制御が最後に達した場合、実行の効果は次のとおりです。mainstd::exitmainreturn

return 0;

inlineメッセージに関しては、constexpr関数は暗黙的にinline. C++11 標準のパラグラフ 7.1.5/2 ( Luc Danton の好意による):

[...]。constexpr関数とconstexprコンストラクターは暗黙的に inline(7.1.2) です。

于 2013-05-23T16:31:49.093 に答える