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

xml*_*lmx 12 c c++ type-conversion string-literals implicit-conversion

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 *'
} 
Run Code Online (Sandbox Code Playgroud)

该代码是使用VC++ 2012年11月的CTP编译的.

§2.14.15字符串文字,第7节

窄字符串文字具有类型"n const char数组",其中n是下面定义的字符串的大小,并且具有静态存储持续时间.

为什么f("Hello")好吗?

Oli*_*rth 16

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

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

在C++中:它永远不会好(AFAIK).* 但是,一些编译器仍然可以让你逃脱它.例如,GCC具有-Wwrite-strings标志,默认情况下启用(至少在4.5.1以后).


*至少在C++ 11中.(我手边没有旧的规格.)

  • 只是一个细节:在C++ 03中,支持从literal到char*的转换,但我记得已弃用; 无论如何,在C++ 11中它已被删除,而不是有效的代码 (2认同)
  • @ sepp2k:微软的编译器从未擅长标准兼容性. (2认同)

Naw*_*waz 7

f("Hello");
Run Code Online (Sandbox Code Playgroud)

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

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

从转换"Hello"char*允许在C++ 03,虽然它已弃用.在C++ 11中,转换无效,代码格式错误.

  • @AndyProwl:我认为它在C++ 03中被弃用,在C++ 11中不合适. (2认同)

Che*_*Alf 7

和...之间的不同

f("Hello");
Run Code Online (Sandbox Code Playgroud)

f(p);
Run Code Online (Sandbox Code Playgroud)

是前者涉及文字.在C++ 03中,支持从字符串文字到char*(注意:不const)的转换.它在C++ 11中不再受支持,但是如果有任何编译器已经赶上规则更改,则很少.