2015-12-17 8 views
7

std::strtolの署名は次のように定式化されるが、以下:私は実際には2番目のパラメータはタイプconst char**であることを期待署名:: strtolは

long strtol(const char *str, char **str_end, int base);

。代わりにchar**のタイプの理由についての説明はありますか?タイプconst char**の変数を変更することができます。変更できないものはchar* const *です。

+0

この関数は、 'str_end'ポインタを変更します。そのため、' char ** 'でなければなりません。 – ForceBru

+0

おそらくそれは関数がCで宣言され、C++が互換性を持たせたいからです。 C言語で宣言された理由は、おそらく古いコードとの下位互換性のためです。正確な理由から、あなたは標準委員会に尋ねなければなりません。 –

+0

@ JoachimPileborg:最初のパラメータが 'const'なのであまり意味がありません。 –

答えて

9

(C90の前に)yの時代には、Cはconstの概念を持たず、全てが平文であるchar*を使用していました。

char*は暗黙的にchar const*に変換できるので、ほとんどのライブラリ関数のシグネチャをconstに変更することはそれほど問題ではありませんでした。 char**しかしchar const**に変換することはできませんCは、委員会の過負荷をサポートしていないので、なぜ

enter image description here

のためのC++標準から次の注を参照してくださいレガシーコードを壊すか、皆を強制間で選択しなければなりませんでしたchar**に合格する。どちらも理想的ではありませんが、彼らは後者と一緒に行ったようです。