所以我有这段代码:
class ConstTest {
public:
explicit ConstTest(char* name) {}
};
int main() {
ConstTest t("blarghgh");
}
显然compiles,即使我认为它不应该。由于C ++中的字符串文字具有类型const char[]
,而ConstTest
构造函数需要无常char*
- 而不是const char*
。并且将一个const
指针转换为非常量指针通常不会被C ++隐式地完成。
那么,我哪里错了?为什么要编译?我可以合法地修改构造函数中的解除引用的指针吗?!
答案 0 :(得分:5)
那么,我哪里错了?为什么要编译?
它正在编译,因为你的编译器过于宽松,并且你的编译器过于宽松,因为在C ++ 03中,从字符串文字到char*
的隐式转换只是不赞成,而不是无效。
基本原理是与传统C API的向后兼容性。根据C ++ 03标准的第4.2 / 2段:
不是宽字符串文字的字符串文字(2.13.4)可以转换为“指针”类型的右值
char
”;宽字符串文字可以转换为“指向wchar_t
的指针”的右值。在任一情况下, 结果是指向数组的第一个元素的指针。只有存在转换时才会考虑此转换 显式适当的指针目标类型,而不是一般需要从左值转换为 右值。 [ 注意:不推荐使用此转化。见附件D. ]
然而,在C ++ 11中,隐式转换是非法的(上面的段落已被完全删除)。
我可以合法地取消引用并修改构造函数中的指针吗?!
您可以,但不能修改取消引用的对象。这样做将是未定义的行为,因为对象的类型是const
- 限定。