![]() |
1
10
这是有效的,因为有一个从
无效,因为您正在尝试将临时值绑定到非常量引用。
这是对const的引用,但类型错误(它是指向char的指针,而不是指向constchar的指针)。此转换将删除
“双重标准”是因为从不允许将非常量引用绑定到临时对象(C甚至没有引用),因此不存在向后兼容性问题。该标准没有区分“错误”和“警告”;对于任何给定的违反规则的行为,编译是否应该成功由编译器作者自行决定。 |
![]() |
2
3
这两个案例都是错误的。然而,该标准并不要求编译器拒绝格式错误的程序。因此,接受警告是完全符合标准的。
主要区别在于,将非常量左值引用绑定到右值时,隐式转换的格式从来都不好
|
![]() |
3
2
常量的规则是,它总是适用于它左边的东西,除非它左边什么都没有,在这种情况下,它适用于紧靠右边的东西。对于EAST const,我们总是把const写在右边。 让我们看看代码:
变成
之所以使用“char const*const”而不是“char const*”,是因为“bla”的地址是恒定的——字符串“bla”被编译到某个固定位置的执行代码中,当加载到内存中时,将一直保持在该内存地址,直到程序终止。 所以现在我们有了匹配的类型,除了引用。
让我们看看第二个:
EAST常量语法:
这些类型不匹配(“bla”的内存位置是固定的)。 也许这段代码会更清楚:
这将在第一行打印“Hello”,在第二行打印“World”。这是因为stringPtr指向的是变化。 因为“bla”的位置是固定的,所以我们不能构造对它的引用,因为“bla”的位置可以通过设置对它的引用来改变。这是不可能的。我们也不可能使用强制转换来强制它成为正确的类型。 这就是为什么即使有警告也不能编译。 我们来看第三个:
这已经是EAST const格式了。 使用“char*const&时-结果引用虽然不允许更改内存位置,但允许您将“bla”修改为“abc”。 也许在某些情况下,你真的想这样做,以节省内存空间,在一些嵌入式系统中,“bla”只是作为一个初始化,不再使用。 这个信息很有道理: 警告:ISO C++禁止将字符串常量转换为“char *” 因为这与:
即使没有-fppermission,我们也可以更改代码来执行强制转换并使其工作。
|