我很難理解爲什麼C++的行爲比C更加「放鬆」,當涉及到解釋和爲函數的參數創建類型。C抱怨通過char **值傳遞給char const * const * const函數,但C++不會
C是世界上最簡單的事情,它堅持你寫的東西,就是這樣,C++另一方面是以一種扭曲的方式運行,我無法真正理解。
例如流行argv
傳遞給函數時,這是一個char* []
變得char**
,我真的不知道爲什麼,我的期望和「希望」是char * const *
,但我得到這個行爲來代替。
您還可以閱讀this article in PDF談到有關C和C之間的這種差異++,文章還用這句話結束:
雖然C++確定功能簽名時忽略頂級CV-預選賽參數 聲明,它不會 完全忽略那些cv-qualifiers。
由於我在網上找不到這個問題(嵌入式系統編程 - 2000年2月,這個老問題是免費的),我想知道這個短語可能意味着什麼。
有人可以解釋爲什麼這種行爲是在C++中的方式?
編輯:
我的一個例子是
#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**
你的argv的例子實際上是C++繼承C.你的PDF會談約*簽名的東西*,它們僅用於重載分辨率。與簡歷檢查沒有任何關係。 –
@HansPassant對於我所關心的,如果這個機制存在於頂層,它仍然會拋棄我的'const',並且我想知道這個怪異行爲背後的原因是什麼。在這個例子中'argv'只是一個玩具。 – user2485710
請用一個具體的例子來幽默我們。 –