C++11标准(ISO/IEC 14882:2011)在§ C.1.1中规定:

char* p = "abc"; // valid in C, invalid in C++

对于C++,它是可以的,因为指向字符串字符串的指针是有害的,因为任何修改它的try 都会导致崩溃.但为什么它在C中有效?

C++11还表示:

char* p = (char*)"abc"; // OK: cast added

这意味着,如果将强制转换添加到第一条语句中,它将变得有效.

为什么C++中的第二个语句有效?它与第一个语句有什么不同?它还有害吗?如果是这样的话,为什么标准说没问题?

推荐答案

直到C++03,您的第一个示例是有效的,但使用了不推荐的隐式转换——字符串文字应被视为类型char const *,因为您无法修改其内容(而不会导致未定义的行为).

从C++11开始,不推荐使用的隐式转换被正式删除,因此依赖它的代码(如第一个示例)应该不再编译.

您已经注意到允许代码编译的一种方法:虽然隐式转换已被删除,但explicit转换仍然有效,因此您可以添加强制转换.然而,我会认为这是"修复"代码.

要真正修复代码,需要将指针的类型更改为正确的类型:

char const *p = "abc"; // valid and safe in either C or C++.

至于为什么它被允许在C++中(仍然是在C中):仅仅因为存在很多依赖于隐式转换的现有代码,并且 destruct 代码(至少没有一些官方警告)显然对标准委员会来说是个坏主意.

C++相关问答推荐

Linux/C:复制修剪了最后一个填零孔的文件

如何在C中的空指针函数中传递浮点值

如何一次获取一个字符

我无法让LLDB正确运行我的可执行文件

如何在c++中包装返回空*的函数

在每种If-Else情况下执行语句的最佳方式

通过描述符查找文件路径时出现问题

用C++构建和使用DLL的困惑

错误:字符串在C中获得意外输出

基于蝶数恰好有8个除数的事实的代码

C中的char**v*char[]

区分MySQL C界面中的文本和BLOB字段

可以';t从A9G模块拨打电话

如何解释数组中的*(ptr)和*(ptr+2)?

分支预测和UB(未定义的行为)

GnuCobol 使用 double 类型的参数调用 C 函数

(GNU+Linux) 多个线程同时调用malloc()

保存有符号整数结果的变量是否会溢出(后增量的副作用),并且此后从未在任何表达式中使用过它,是否会导致 UB?

在链表中插入一个值

malloc:损坏的顶部大小无法找出问题