为什么字符串文本只能在某些情况下隐式转换为 char*

Why can a string literal be implicitly converted to char* only in certain case?

本文关键字:转换 char 情况下 文本 字符串 为什么      更新时间:2023-10-16
void f(char* p)
{}
int main()
{
    f("Hello"); // OK
    auto p = "Hello";
    f(p); // error C2664: 'void f(char *)' : cannot convert parameter 1 
          // from 'const char *' to 'char *'
} 

该代码是使用 VC++ Nov 2012 CTP 编译的。

§2.14.15 字符串文本,第 7 节

窄字符串文本的类型为"n 常量字符数组",其中 n 是 字符串的大小如下所述,并具有静态存储 期间。

为什么f("Hello")没问题?

这种行为在 C 和 C++ 之间有所不同,至少在理论上是这样。

在 C 中:字符串文本衰减为非常量指针。 但是,这并不是一个好主意;尝试通过该指针修改字符串会导致未定义的行为。

C++:它永远不会好(AFAIK(。* 但是,某些编译器可能仍然可以让您侥幸逃脱。 例如,GCC 具有 -Wwrite-strings 标志,默认情况下启用该标志(至少在 4.5.1 及更高版本中(。


* 至少在 C++11 年。 (我手头没有较旧的规格。

两者之间的区别

f("Hello");

f(p);

是前者涉及字面意思。在 C++03 中,支持从字符串文字到 char* 的转换(注意:不是const(。它在 C++11 中不再受支持,但很少有编译器赶上该规则更改。

f("Hello");

即使这样在C++也不行。编译器应提供诊断,否则需要更新。

在C++中,"Hello"可以转换为const char*,而不是char*

C++03 允许从 "Hello" 转换为 char*,但已弃用。而在 C++11 中,转换无效,代码格式不正确。

我认为是因为自动关键字。 它是类型推导,所以编译器不再知道如何转换为 char*。