C++11 標準によると、次のプログラムは整形式で移植可能な C++ ですか?
int main(int argc, char const* const* argv) {}
いいえ。純粋な移植可能な C++ プログラムでは、argv
引数が存在する場合、const
修飾子はありません。
編集: C++11 ドラフト標準のセクション 3.6.1.2 を参照してください。
実装は、メイン関数を事前定義してはなりません。この関数はオーバーロードされません。型 int の戻り値の型を持つ必要がありますが、それ以外の場合、その型は実装定義です。すべての実装は、main の次の定義の両方を許可する必要があります。
int main(){ /*...*/ }
と
int main(int argc, char* argv[]) { /* ... */ }
ポータブルの意味によって異なります。int(int,char const*const*)
悪意のある C++ 実装は、その署名が必要な許可された署名の 1 つと異なるという理由でそれを拒否する可能性がint()
ありint(int,char**)
ます。(悪意のある実装は一見拒否するauto main(int argc,char* argv[]) -> int
か、実際にmain
は body が存在しない場所の定義を拒否する可能性があります{ /* ... */ }
)
ただし、これは一般的ではありません。const を追加すると の呼び出しに問題が発生する実装については知りません。C++ 11 では「類似の」型に関するビットが追加されているため、変数を介してオブジェクトmain
にアクセスするときに厳密なエイリアシング規則に違反することはありません。char**
char const * const *
したがって、適合する実装は技術的に拒否する可能性がありますが、使用したい実装に移植できると思います。