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

问题描述 投票:0回答:4

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++ c string c++11 char
4个回答
331
投票

通过 C++03,您的第一个示例是有效的,但使用了已弃用的隐式转换 - 字符串文字应被视为类型

char const *
,因为您无法修改其内容(不会导致未定义的行为) .

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

您已经注意到允许代码编译的一种方法:尽管隐式转换已被删除,但显式转换仍然有效,因此您可以添加强制转换。但是,我不会考虑“修复”代码。 真正修复代码需要将指针的类型更改为正确的类型:

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

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


29
投票
char *

而不是

const char *
,尽管它通过说实际上不允许修改它来限定它。

当您使用强制转换时,您实际上是在告诉编译器您比默认类型匹配规则更了解,并且它使赋值正常。


14
投票
strdup

char* p = strdup("abc");

char p[] = "abc";

如所指出的
这里


7
投票

char data[] = "Testing String";

const char* data = "Testing String";

char* data = (char*) "Testing String";

© www.soinside.com 2019 - 2024. All rights reserved.