とstrtod()
は効果的にあなたが文字列内のconstnessをキャストすることを許しているようです:
#include <stdlib.h>
#include <stdio.h>
int main() {
const char *foo = "Hello, world!";
char *bar;
strtol(foo, &bar, 10); // or strtod(foo, &bar);
printf("%d\n", foo == bar); // prints "1"! they're equal
*bar = 'X'; // segmentation fault
return 0;
}
上では、自分でキャストを実行しませんでした。しかし、strtol()
は、基本的に私のconst char *
をchar *
にキャストし、警告や何もせずに。 (実際には、bar
をconst char *
とタイプすることができないため、タイプの安全でない変更が強制されます)。それは本当に危険ではありませんか?
しかし、C++は関数のオーバーロードを防ぎません:long int strtol(char * nptr、char ** endptr、int base); '*と*' long int strtol(const char * nptr、const char ** endptr、int base); ':これはあなたのコンパイルエラーを修正します。実際には、標準では 'strchr'や' strstr'のような他の関数のためにこれを行なっています。 – Thanatos
CのFAQ Webサイト['const char * p'と' char const * p'との違いは何ですか? 'char * const p'?](http://c-faq.com/ansi/constptrconst.html)を参照してください。特に、 '' char ** 'を '' ' const char ** '?](http://c-faq.com/ansi/constmismatch.html)をC++ FAQの代わりに使用していますが、説明が分かりやすいと私は完全には思っていません。 –