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以后).
f("Hello");
Run Code Online (Sandbox Code Playgroud)
即使这在C++中也不行.编译器应该提供诊断,否则需要更新.
在C++中,"Hello"可以转换为const char*,而不是char*.
从转换"Hello"到char*允许在C++ 03,虽然它已弃用.在C++ 11中,转换无效,代码格式错误.
和...之间的不同
f("Hello");
Run Code Online (Sandbox Code Playgroud)
和
f(p);
Run Code Online (Sandbox Code Playgroud)
是前者涉及文字.在C++ 03中,支持从字符串文字到char*(注意:不const)的转换.它在C++ 11中不再受支持,但是如果有任何编译器已经赶上规则更改,则很少.