为什么字符串文本只能在某些情况下隐式转换为 char*
Why can a string literal be implicitly converted to char* only in certain case?
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 常量字符数组",其中 n 是 字符串的大小如下所述,并具有静态存储 期间。
为什么f("Hello")
没问题?
这种行为在 C 和 C++ 之间有所不同,至少在理论上是这样。
在 C 中:字符串文本衰减为非常量指针。 但是,这并不是一个好主意;尝试通过该指针修改字符串会导致未定义的行为。
C++:它永远不会好(AFAIK(。* 但是,某些编译器可能仍然可以让您侥幸逃脱。 例如,GCC 具有 -Wwrite-strings
标志,默认情况下启用该标志(至少在 4.5.1 及更高版本中(。
* 至少在 C++11 年。 (我手头没有较旧的规格。
两者之间的区别
f("Hello");
和
f(p);
是前者涉及字面意思。在 C++03 中,支持从字符串文字到 char*
的转换(注意:不是const
(。它在 C++11 中不再受支持,但很少有编译器赶上该规则更改。
f("Hello");
即使这样在C++也不行。编译器应提供诊断,否则需要更新。
在C++中,"Hello"
可以转换为const char*
,而不是char*
。
C++03 允许从 "Hello"
转换为 char*
,但已弃用。而在 C++11 中,转换无效,代码格式不正确。
我认为是因为自动关键字。 它是类型推导,所以编译器不再知道如何转换为 char*。
相关文章:
- 将无符号char*转换为std::istream*C++
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 使用char类型将decimal转换为string,将string转换为decimal
- 如何在对<char>C++程序进行逆向工程的同时将 std::basic_string 转换为 Rust 可读值?
- 将函数参数"const char*"转换为"std::string_view"是
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- C ++如何在使用"tolower"时将char转换为int
- 有没有办法在C++的赋值中将"char**"转换为"double"?
- 如何使用多次 memcpy 转换回 std::vector<unsigned char>?
- 将"uint8_t"(从套接字读取)隐式转换为"char"安全吗
- JavaCPP 错误:无法将参数"1"的"char*"转换为"Abc*
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- 转换char*时的值不同
- Boost Python 不会自动转换 char* 数据成员
- 除了转换char*之外,还有更好的方法来获得一个变量值吗?
- 如何跨平台转换char*到long long(64位)
- 用atof转换char数组中的浮点数
- C转换char[]为时间戳;