用字符串字面量初始化非常量参数
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:好的,很高兴它有帮助。如果这回答了您的问题,请考虑在您被允许时将其标记为已接受:)以上是关于用字符串字面量初始化非常量参数的主要内容,如果未能解决你的问题,请参考以下文章