用字符串字面量初始化非常量参数

Posted

技术标签:

【中文标题】用字符串字面量初始化非常量参数【英文标题】:Initializing non-const parameter with string literal 【发布时间】:2013-05-28 12:35:17 【问题描述】:

所以我有这个代码:

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

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

显然compiles,尽管我认为它不应该。由于 C++ 中的字符串文字具有 const char[] 类型,而 ConstTest 构造函数需要无 const 的 char* — 而不是 const char*。并且将 const 指针转换为非常量指针并不是 C++ 通常隐式执行的操作。

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

【问题讨论】:

相关:***.com/questions/10268705/… 【参考方案1】:

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

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

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

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

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

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

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

【讨论】:

是的,我的意思是访问取消引用的对象。感谢您的回答! @ulidtko:好的,很高兴它有帮助。如果这回答了您的问题,请考虑在您被允许时将其标记为已接受:)

以上是关于用字符串字面量初始化非常量参数的主要内容,如果未能解决你的问题,请参考以下文章

C++11 字符数组初始化和字符串字面量

javascript里面的字面量是啥意思啊?

JavaScript语言精粹

前端学习(24)~js学习:变量

Swift和Java关于字符串和字符的比较

04_字符串的字面量