![](/img/trans.png)
[英]Converting from "foo<T>" to "const foo<const T>" - C++
[英]Why converting Foo** → const Foo** is an error in C++, but only a warning in C?
C 和 C++ 都將語句 3 處理為“使用char**
分配const char**
char**
會丟棄const
限定符”,區別在於; C++ 比 C 更嚴格,並且不允許丟棄const
限定符。 這在 C++ 中非常方便,並且不會導致與 C 相反的問題。
想象一下以下代碼:
char const c = 'x';
char *p1 = &c;
*p1 = 'A';
printf("c address: 0x%X, p1 is pointing to: 0x%X\n", &c, p1);
printf("%c\n", c);
printf("%c\n", *p1);
這是一個可編譯的 C 代碼。 有人會認為為*p1
分配一個新值應該是不可能的,因為它指向一個const
變量。 還有人會認為,如果它確實發生了,我們可以改變 p 指向的值,這也會改變c
的值,但事實並非如此!!
上面的代碼出人意料地生成:
c address: 0xEF3E146B, p1 is pointing to: 0xEF3E146B
x
A
因此,允許丟棄這個 const 限定符確實會導致未定義的行為(這意味着由編譯器決定要做什么)。 這在 C++ 中是固定的,以避免這種歧義。
C 的指針規則比 C++ 寬松得多。 C++ 比 C 強制執行更多的類型安全。其中一些取決於編譯器決定只在 C 中發出警告。
要查看的一個示例是 malloc,其中char* str = malloc(50);
非常好 C 但必須是char* str = (char*) malloc(50);
在 C++ 中。
簡短的回答是:因為它們是不同的語言並且有不同的規則。 沒有 C/C++ 語言。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.