関数のパラメーターの型の解釈と作成に関して、C++ が C よりも「リラックスした」方法で動作する理由を理解するのに苦労しています。
C は世界で最も単純なことを行います。それはあなたが書いたものに固執し、それだけです。一方、C++ は私が本当に理解できないねじれた方法で動作します。
たとえば、関数に渡されたときに人気argv
があり、その理由が本当にわかりません.char* []
char**
char * const *
C と C++ のこの違いについて説明しているこの記事を PDFで読むこともできます。この記事も次のフレーズで終わります。
C++ は、関数シグネチャを決定するときにパラメーター宣言のトップレベルの cv 修飾子を無視しますが、それらの cv 修飾子を完全に無視するわけではありません。
また、この号をオンラインで見つけることができないので ( Embedded System Programming - February 2000 、およびこの古い号は無料です )、このフレーズが何を意味するのか疑問に思っています。
この動作が C++ での方法である理由を誰かが説明できますか?
編集:
私の例の1つは
#include <stdio.h>
void foo(int argc, const char *const *const argv) {
printf("%d %s\n", argc, argv[0]);
}
int main(int argc, char *argv[]) {
foo(argc, argv);
return (0);
}
これをコンパイルするとgcc 4.8.1
、予想されるエラーが発生します
gcc cv_1.c
cv_1.c: In function ‘main’:
cv_1.c:8:3: warning: passing argument 2 of ‘foo’ from incompatible pointer type [enabled by default]
foo(argc, argv);
^
cv_1.c:3:6: note: expected ‘const char * const* const’ but argument is of type ‘char **’
void foo(int argc, const char *const *const argv) {
^
argv
この出力は、次のように解釈される事実を暗黙的にします。char**