2012-06-26 15 views

答えて

11

純粋なポータブルC++プログラムで号、argv引数が、存在する場合、const改質剤を有していません。

編集:C++ 11ドラフト規格のを参照してくださいセクション3.6.1.2、(バージョンでは、私は私の前に持っている)状態:

を実装が主な機能をあらかじめ定義してはなりません。この関数 は過負荷にならないものとします。戻り値の型はint型でなければならないが、 でなければならない。そうでなければ、その型は実装定義である。すべての実装 は、メインの次の定義の両方を許可しなければならない。

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

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

3

あなたは、ポータブルで何を意味するかに依存します。邪悪なC++の実装では、署名(int(int,char const*const*))が必要な許可された署名の1つであるint()int(int,char**)と異なることを理由にそれを拒否することができます。

を(悪実装は、一見、実際に、本体は{ /* ... */ }ないmainの任意の定義をauto main(int argc,char* argv[]) -> intを拒否または可能性)しかしながら、これは一般的ではありません。 constを追加すると、mainを呼び出す問題が発生し、C++ 11が「類似の」タイプのビットを追加したため、char**オブジェクトにchar const * const *でアクセスすると、厳密なエイリアシング規則に違反しないため、変数。

したがって、準拠している実装では技術的に拒否することができますが、使用する気になる実装には移植可能です。

+0

私は、正規のエイリアスに類似の型を追加することは、提供された引数と仮引数に型が一致しない関数を有効にすることを意図していることを認識していませんでしたが、それはたぶんうまくいくでしょう。 –

+0

@SteveJessopこれを有効にすることは意図されておらず、仮パラメータに 'const'を追加すると名前のマングリングに影響するため、一般的に有効にしません。これが 'main'のために働く理由は' main'が(あなたがメインに過負荷を与えられないので)manglingから免除されるのが普通であるからです。同様の型を追加するということは、 'char **'に 'char const * const *'としてアクセスするときに、厳密なエイリアシング規則に違反する未定義の動作を自動的に取得しないことを意味します。私が知っているすべての実装について、C++ 11よりもうまく機能しましたが、技術的にはUBでした。今ではUBであってはならない – bames53

+3

'auto main(int argc、char * argv []) - > int'が別のシグネチャであることにソースや標準引用符があるのはどうですか? 'int main(int argc、char ** argv)'も異なる署名ではないのですか? –

関連する問題