这是合法的C / C ++吗? `int * p =(int ){1,2,3};`

我的这个答案产生了一些评论声称以下构造不是合法的C / C ++:

void f (int* a) ; f ((int[]){1,2,3,4,0}) ; 

(请参阅此完整程序的ideone链接 )。 但我们无法解决问题。 任何人都可以对此有所了解吗? 各种标准有什么用?

据我所知,这是有效的C99 – 这是通过复合文字。

C99标准以此为例(§6.5.2.5/ 9):

示例1文件范围定义

 int *p = (int []){2, 4}; 

初始化p指向两个整数数组的第一个元素,第一个元素的值为2,第二个元素的值为4。 此复合文字中的表达式必须是常量。 未命名的对象具有静态存储持续时间。

请注意, (int [])事物不是这里的演员。

这不是一个有效的C ++构造,复合文字不是C ++标准的一部分(包括C ++ 11)。 一些编译器允许它作为扩展。 (GCC确实,通过-Wall -pedantic来获取它的诊断.IBM xlC也允许它作为扩展 。)

作为参数传递给函数的表达式是复合文字的示例。 这些在C99中是合法的,但在C ++ 98中则不合法。

例如,参见N897“C99标准的基本原理草案 ”中的第6.4.4节“常量”和6.8“语句和块” 。 另见GCC文档的这一部分 。

好吧,根据C ++ 11,我认为它是有效的。 第5.2节:

 postfix-expression: ... typename-specifier ( expression-listopt ) simple-type-specifier braced-init-list typename-specifier braced-init-list ... expression-list: initializer-list 

编辑:经过一些阅读后,我得出结论它实际上是无效的 ,因为你不能像这样使用后缀表达式。 应该有一些主要的表达方式。