const char *cval = "nothing"; // This is right.
int *ival = {1, 2, 3, 4}; // This is wrong.
Run Code Online (Sandbox Code Playgroud)
为什么第一个是对的,但第二个是错的?
之所以如此,是因为语言规范是这样说的(对每种语言都是独立的).
在C和C++中,字符串文字是无名对象,左值.由于它是一个对象,您可以使用指针指向它.同时{1, 2, 3, 4}
它只是一个不代表对象的语法结构.它只是形成聚合初始化器语法的正式字符序列.
同时,在C语言中(自C99起),有一个名为复合文字的特征,它允许人们形成聚合类型的无名对象.例如,以下初始化有效
int *ival = (int []) {1, 2, 3, 4};
Run Code Online (Sandbox Code Playgroud)
这基本上是第一个声明的"int数组"对应物.所以,从C的角度来看,你的第二个声明是"错误的",因为你使用了不正确的语法.
char *cval = "nothing"; // This is right.
Run Code Online (Sandbox Code Playgroud)
字符串文字有特殊处理 - 编译器知道将文本"nothing\0"放在某个(不可变)内存中的某个地方,使用类型char[]
,然后数组衰减到char*
可以复制到的内容cval
(对于C++ 03及更早版本,你应该使用的C++ 11 const char*
).这与...形成鲜明对比
int *ival = {1, 2, 3, 4}; // This is wrong.
Run Code Online (Sandbox Code Playgroud)
...编译器不希望将{1,2,3,4}存储在只读内存中 - 它只需要:
用于分配给数组-的值复制到连续的阵列位置的局部声明的对象(但如果ival
是int*
没有分配的值存储将投入)
对于构造函数接受initializer_list
s的类,创建一个并调用该构造函数.
归档时间: |
|
查看次数: |
194 次 |
最近记录: |