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

时间:2013-05-28 12:35:18

标签: c++ const-correctness

所以我有这段代码:

class ConstTest {
public:
    explicit ConstTest(char* name) {}
};

int main() {
    ConstTest t("blarghgh");
}

显然compiles,即使我认为它不应该。由于C ++中的字符串文字具有类型const char[],而ConstTest构造函数需要无常char* - 而不是const char*。并且将一个const指针转换为非常量指针通常不会被C ++隐式地完成。

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

1 个答案:

答案 0 :(得分:5)

  

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

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

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

  

不是宽字符串文字的字符串文字(2.13.4)可以转换为“指针”类型的右值   char”;宽字符串文字可以转换为“指向wchar_t的指针”的右值。在任一情况下,   结果是指向数组的第一个元素的指针。只有存在转换时才会考虑此转换   显式适当的指针目标类型,而不是一般需要从左值转换为   右值。 [ 注意:不推荐使用此转化。见附件D. ]

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

  

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

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