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 ++ 2012年11月的CTP编译的。
§2.14.15字符串文字,第7节
窄字符串文字的类型为“n const char数组”,其中n为 如下定义的字符串大小,并具有静态存储 持续时间。
为什么f("Hello")
可以?
答案 0 :(得分:16)
这种行为在C和C ++之间有所不同,至少在理论上是这样。
在C:中,字符串文字衰减为非const指针。但是,这并不是一个好主意;尝试通过该指针修改字符串会导致未定义的行为。
在C ++中:它永远不会正常(AFAIK)。 * 然而,一些编译器仍然可以让你逃脱它。例如,GCC具有-Wwrite-strings
标志,默认情况下启用(至少在4.5.1以后)。
<小时/> *至少在C ++ 11中。 (我没有旧的规格。)
答案 1 :(得分:7)
f("Hello");
即使这在C ++中也不行。编译器应该提供诊断,否则需要更新。
在C ++中,"Hello"
可转换为const char*
,而不是char*
。
C ++ 03允许从"Hello"
转换为char*
,但已弃用。在C ++ 11中,转换无效,代码格式不正确。
答案 2 :(得分:7)
之间的区别
f("Hello");
和
f(p);
是前者涉及文字。在C ++ 03中,支持从字符串文字到char*
(注意:不是const
)的转换。它在C ++ 11中不再受支持,但是如果有任何编译器还没有采用该规则的改变那么很少。
答案 3 :(得分:-1)
我认为因为auto关键字。这是类型推导,所以编译器不知道如何转换为char *。