5

所以我有这个代码:

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

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

它显然可以编译,即使我认为它不应该。由于 C++ 中的字符串文字有 type const char[],而ConstTest构造函数需要一个 const-less char*- not const char*。并且将const指针强制转换为非 const 通常不是 C++ 隐式完成的。

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

4

1 回答 1

5

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

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

理由是向后兼容遗留的 C API。根据 C++03 标准的第 4.2/2 段:

不是宽字符串文字的字符串文字(2.13.4)可以转换为类型为“pointer to char”的右值;宽字符串文字可以转换为“pointer to wchar_t”类型的右值。无论哪种情况,结果都是指向数组第一个元素的指针。仅当存在显式适当的指针目标类型时才考虑这种转换,而不是当一般需要从左值转换为右值时。[注意:此转换已弃用。见附件 D。 ]

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

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

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

于 2013-05-28T12:36:57.617 回答