[英]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.