使用字符串文字初始化非const参数

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++隐式地执行指向非常量指针的指针.

那么,我哪里错了?为什么要编译?我可以合法地修改构造函数中的解除引用指针吗?!

And*_*owl 5

那么,我哪里错了?为什么要编译?

它正在编译,因为你的编译器过于宽松,并且你的编译器过于宽松,因为在C++ 03中,从字符串文字的隐式转换char*只是被弃用,而不是无效.

基本原理是与传统C API的向后兼容性.根据C++ 03标准的第4.2/2段:

不是宽字符串文字的字符串文字(2.13.4)可以转换为"指向char" 的类型的右值 ; 可以将宽字符串文字转换为"指向wchar_t" 的类型的右值.在任何一种情况下,结果都是指向数组第一个元素的指针.仅当存在明确的适当指针目标类型时才考虑此转换,而不是在通常需要从左值转换为右值时.[ 注意:此转换已弃用.见附件D. ]

但是,在C++ 11中,隐式转换是非法的(上面的段落已被完全删除).

我可以合法地取消引用并修改构造函数中的指针吗?!

您可以,但不能修改取消引用的对象.这样做将是未定义的行为,因为对象的类型是const限定的.