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