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

时间:2013-01-19 14:44:46

标签: c++ c type-conversion implicit-conversion string-literals

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")可以?

4 个答案:

答案 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 *。