为什么从字符串常量到 'char*' 的转换在 C 中有效但在 C++ 中无效

2024-02-12

C++11 标准 (ISO/IEC 14882:2011) 中表示§ C.1.1:

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

对于 C++ 来说,这是正常的,因为指向字符串文字的指针是有害的,因为任何修改它的尝试都会导致崩溃。但为什么它在 C 中有效呢?

C++11 还说:

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

这意味着如果将强制转换添加到第一个语句,它就会变得有效。

为什么转换使第二条语句在 C++ 中有效?它与第一条语句有何不同?不是仍然有害吗?如果是这样的话,为什么标准说可以呢?


在 C++03 之前,您的第一个示例是有效的,但使用了已弃用的隐式转换 - 字符串文字应被视为类型char const *,因为您无法修改其内容(不会导致未定义的行为)。

从 C++11 开始,已弃用的隐式转换已被正式删除,因此依赖于它的代码(如您的第一个示例)不应再编译。

您已经注意到一种允许代码编译的方法:虽然隐式转换已被删除,但explicit转换仍然有效,因此您可以添加强制转换。我会not但是,请考虑这“修复”代码。

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么从字符串常量到 'char*' 的转换在 C 中有效但在 C++ 中无效 的相关文章

随机推荐