字符串数组[] = " " 是什么;意思是,为什么它有效?
What does string array[] = ""; mean and why does it work?
string array[] = "";
我如何能够将const char*
分配给数组?与:
string array[] = {""};
??这对我来说很有意义。但是,这仍然不起作用
int array[] = 5;
那么它们对int
数组不起作用有什么区别?
这是不正确的代码;接受它是您的编译器(可能是GCC/G ?)中的错误。
clang给出以下错误(链接):
a.cpp:5:17: error: array initializer must be an initializer list
std::string array[] = "";
^
1 error generated.
Visual C 同意(链接):
testvc.cpp(2) : error C3074: an array can only be initialized with an initializer-list
标准中的相关子句为8.5p17:
[...]
- 如果目标类型是字符的数组,一个char16_t的数组,char32_t的数组或WCHAR_T数组,并且初始化程序是字符串字面的字符串,请参见8.5.2。
[...]
- 否则,如果目标类型是数组,则该程序是不形成的。
[...]
作为错误提交给GCC:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60009
实际上,该功能是从空的char
数组的初始化中的结转。(std::string
的作用与char
非常相似。)
char buf[10] = "";
等于char buf[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
,但char buf[10] = "a";
等于char buf[10] = {'a', 0, 0, 0, 0, 0, 0, 0, 0, 0};
。为什么?由于 char
是算术值,因此自动限制为零。
您的编译器将""
视为char
值(从技术上讲const char*
),并将其简单地投入到std::string
。虽然这并不完全符合标准,但它适用于大多数编译器。
相关文章:
- 为什么是0;C++中的有效语句
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 为什么这种直接初始化有效?(C++17)
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 为什么浮点数的矢量化比双精度更有效?
- 为什么模板参数中的双冒号有效?
- 为什么在这种情况下递增阵列名称有效?
- 为什么TinyXML2的XMLDocument::FirstChild()函数在尝试解析这个有效的XML文件时返回NULL?
- 这是什么代码?为什么它有效?C++
- 为什么别名声明不是有效的 init 语句(/simple-declaration)?
- 为什么在 C/C++ 中交织 switch/for/if 语句是有效的?
- 为什么这个复合语句作为用大括号和括号括起来的语句序列似乎不是有效的语句表达式
- 为什么使用不匹配的参数调用重载函数仍然有效
- 通过指针调用模板类成员函数 [为什么这是有效的 c++]?
- 将第一个派生类转换为第二个派生类 - 为什么有效?
- 通过 typedef 模板<类型名 T、T> 强制模板实例化 - 为什么有效?
- 这究竟为什么有效?(静态还是其他?)
- 从 r 值引用转换为 l 值引用,为什么有效
- 默认模板参数 - 不必来自右边?为什么有效?
- 为什么 X 有效但未声明?C++