在 C++11 标准中哪里说 char* p = "abc" ;格式不正确?
Where in the C++11 Standard does it say that char* p = "abc"; is ill-formed?
在C++11标准中哪里说char* p = "abc";
格式不正确?
这在 C++03 中仍然有效(尽管已弃用(,但在 C++11 中情况发生了变化。C++11标准附录C提到(见C1.1(:
更改:字符串文本
const
字符串文本的类型从"
char
数组"更改为"const char
数组"。的类型char16_t
字符串文字从"某个整数类型的数组"更改为"const char16_t
数组"。这char32_t
字符串文本的类型从"某个整数类型的数组"更改为"const char32_t
数组"。 宽字符串文本的类型从"wchar_t
数组"更改为"const wchar_t
数组"。理由:这避免了调用不适当的重载函数,该函数可能期望能够 修改其参数。
对原始特征的影响:更改为明确定义的功能的语义。
转换难度:句法转换。解决方法是添加强制转换:
char* p = "abc"; // valid in C, invalid in C++ void f(char*) { char* p = (char*)"abc"; // OK: cast added f(p); f((char*)"def"); // OK: cast added }
在 C++03 中,这是隐式转换规则的例外。在 C++11 中,这个例外消失了,这也许就是为什么你在标准中找不到提到这种情况的点。
上面引用的段落已添加到附件 C 中(仅提供信息,而不是规范性(,以便您可以找到重大变更的证据。
无论如何,相关段落是 2.14.5/8:
普通字符串文本和 UTF-8 字符串文本也称为窄字符串文本。狭窄的 字符串文本的类型为">
n const char
数组",其中n
是下面定义的字符串的大小,并且具有 静态存储持续时间 (3.7(。
和 4.4/1(另请参阅 4.2 的数组到指针转换(:
cv2 T
cv1 T
如果 "cv2 T
" 是 比《cv1 T
》更cv
合格。
相关文章:
- 如何在openssl-ecc中获取十六进制格式的私钥
- 将"打开的CV图像"中的"颜色"转换为整数格式
- TDateTime格式在C++Builder中不会更改
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 检查不带转换的扫描格式
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 是否可以从格式字符串中检索"width"
- clang格式:宏的缩进
- clang格式:禁用排序包含
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 将RGB图像保存为PPM格式
- 询问在设计我的手臂模拟器功能表示格式1
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 如何将strftime中的格式错误作为异常捕获
- 将CHW格式的浮点向量转换为cv::Mat
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 如何以叮当格式设置评论的行长?
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 在 C++11 标准中哪里说 char* p = "abc" ;格式不正确?