12
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 const char 数组”,其中 n 是字符串的大小,定义如下,并且具有静态存储持续时间。

为什么f("Hello")可以?

4

4 回答 4

16

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

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

在 C++ 中:永远不行(AFAIK)。* 然而,一些编译器可能仍然会让你侥幸逃脱。例如,GCC 具有-Wwrite-strings默认启用的标志(至少在 4.5.1 及更高版本中)。


* 至少在 C++11 中。(我手头没有旧规格。)

于 2013-01-19T14:45:51.503 回答
7

和...之间的不同

f("Hello");

f(p);

是前者涉及文字。在 C++03 中,支持从字符串文字到char*(注意:not const)的转换。在 C++11 中不再支持它,但如果有编译器的话,很少有编译器能跟上该规则的变化。

于 2013-01-19T14:56:05.383 回答
7
f("Hello");

即使这在 C++ 中也不行。编译器应该给出诊断,否则需要更新。

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

"Hello"从to的转换char*在 C++03 中是允许的,尽管它已被弃用。而在 C++11 中,转换无效,代码格式不正确。

于 2013-01-19T14:46:43.617 回答
-1

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

于 2013-01-19T14:47:52.257 回答