C++ 这是合法的信用证吗+`int*p=(int[]){1,2,3}`

C++ 这是合法的信用证吗+`int*p=(int[]){1,2,3}`,c++,c,arrays,standards,literals,C++,C,Arrays,Standards,Literals,生成了一些评论,声称以下构造不是合法的C/C++: void f (int* a) ; f ((int[]){1,2,3,4,0}) ; (有关完整程序,请参阅)。但我们没能解决这个问题。有人能解释一下吗?各种标准都说了些什么?好吧,我认为根据C++11,它是有效的。第5.2节: postfix-expression: ... typename-specifier ( expression-listopt ) simple-type-specifier braced-i

生成了一些评论,声称以下构造不是合法的C/C++:

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

(有关完整程序,请参阅)。但我们没能解决这个问题。有人能解释一下吗?各种标准都说了些什么?

好吧,我认为根据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
编辑:
经过进一步阅读,我得出结论,它实际上是无效的,因为你不能像那样使用后缀表达式。应该有一些主表达式。

据我所知,它是有效的C99-这是传递一个复合文本

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

示例1文件范围定义

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

请注意,
(int[])
东西在这里不是强制转换


这不是一个有效的C++构造,但是复合文字不是C++标准(包含C++ 11)的一部分。有些编译器允许它作为扩展。(GCC会传递

-Wall-pedantic
以获取关于它的诊断。IBM xlC。)

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


例如,请参见GCC文档中的第6.4.4节“常量”和第6.8节“语句和块”。

我认为@Nicol Bolas是对的,他对您的帖子发表了评论。并不是所有有效的东西都是有效的。事实上,这种情况经常发生。我想说你评论中的片段会导致“未定义的行为”。因此,如果你想证明他这是合法的,你必须在c/c++/c++11标准中进行搜索。@Michael:我不想证明这是合法的,我只想知道它是否合法。C++的C++ C++语言——编译程序,代码是C++,编译程序是用C代码> G++-Walth-Wu-PoAdTIC-STD= C++ 98 产生“警告:ISO C++禁止复合文字”。没有警告,你可以引用。我看不出有什么能证明这一点。你发布的代码片段与问题不符。如果您感兴趣,这种类型的强制转换语法在§5.4中,而不是在§5.2中。您还应该仔细阅读允许的转换,您将发现不允许强制转换为数组类型。@R.Martinho Fernandes:现在我很困惑。我认为
typename说明符加括号的init list
可以将eq.写成
sometype{1,2,3,4}
,但gcc不允许我这样做。这只适用于结构,还是我完全错了?是的,这种语法是允许的,尽管不是所讨论的语法。要么您有4.6之前的GCC版本,要么您没有使用
-std=c++0x
进行编译,要么代码中有其他错误(您是否确保
sometype
具有适当的构造函数?@R。Martinho Fernandes:抱歉,我不够清楚。它允许我只对结构使用这种语法(即sometype是一个结构)。我没有使用自定义构造函数尝试类,但我想应该是相同的。如果它出现在函数定义中,则它具有与封闭块相关联的自动存储持续时间(即,当执行到达封闭块时,对象和指向它的任何指针都将无效)。这与字符串文字不同,字符串文字总是具有静态存储持续时间。谢谢!这似乎涵盖了所有内容。
char*p=(char[]){'s',t',r',i',n',g',0}
have的存储持续时间是多少?@drhirsch:如果在函数内,则自动;如果在全局范围内,则静态。
int *p = (int []){2, 4};