C++ 为什么将实际数组(不是数组变量)作为参数传递给函数会引发错误?

C++ 为什么将实际数组(不是数组变量)作为参数传递给函数会引发错误?,c++,C++,所以,我试图从头开始学习指针,我偶然发现了这个。 我试着做了以下几点: void func(int* ptr){ //Yada-yada } int main(){ int a[] = {1,2,3,4,5}; func(a); } void func(int* ptr){ //Yada-yada } int main(){ int a[] = {1,2,3,4,5}; func({1,32}); } 结果很好。但后来,我试着做了以下几点: void func(int

所以,我试图从头开始学习指针,我偶然发现了这个。 我试着做了以下几点:

void func(int* ptr){
  //Yada-yada
}
int main(){
  int a[] = {1,2,3,4,5};
  func(a);
}
void func(int* ptr){
  //Yada-yada
}
int main(){
  int a[] = {1,2,3,4,5};
  func({1,32});
}
结果很好。但后来,我试着做了以下几点:

void func(int* ptr){
  //Yada-yada
}
int main(){
  int a[] = {1,2,3,4,5};
  func(a);
}
void func(int* ptr){
  //Yada-yada
}
int main(){
  int a[] = {1,2,3,4,5};
  func({1,32});
}
它返回了一个错误,说

初始值设定项值太多 所以我把它换成了

结果是

“int”类型的值不能用于初始化“int*类型的实体

所以我想知道为什么会这样。编译器是否为未用作变量右值的数组分配空间??因为如果是这样,那么预期的结果将是在{1,32}或{1}情况下,
ptr
被传递第一个变量的地址

提前谢谢。
附言:只有当你想帮忙的时候才回答这个问题。如果你有意见告诉我去读一本书或什么的,我已经在读了。但是对于那些真正想提供帮助的人来说,参考文献的链接是非常感谢的。

{1,32}
不是“实际的数组”。这是一个括号内的初始化器列表。指针参数不能用这样的列表初始化,除非列表正好包含一个可转换为指针类型的初始化器。

{1,32}
不是“实际数组”。这是一个括号内的初始化器列表。指针参数不能用这样的列表初始化,除非列表正好包含一个可转换为指针类型的初始化器。

{1,32}
是一个
std::initialized_list
,不能转换为
int*
。阅读
{1,32}
不是数组。它没有一个完全根据C++语言规范的类型。它是一种可以用来初始化对象的语法结构。有时,可以从中推断出对象的属性,但这些是例外,而不是规则。@StoryTeller UnslanderMonica您应该将其作为答案发布。
{1,32}
是一个
std::initialized_list
,不能转换为
int*
。阅读
{1,32}
不是数组。它没有一个完全根据C++语言规范的类型。它是一种可以用来初始化对象的语法结构。有时,可以从中推断出对象的属性,但这些是例外情况,而不是规则。@StoryTeller UnslanderMonica您应该将其作为答案发布。因此,第二种情况失败,因为具有多个项的初始值设定项列表通常不兼容。第三种情况则会失败,因为如果包含的
int
兼容,则包含1项的列表将兼容,但不兼容。(OP很幸运,最后一个代码片段导致了更多的混乱。)因此,第二个案例失败了,因为具有多个项目的初始值设定项列表通常不兼容。第三种情况则会失败,因为如果包含的
int
兼容,则包含1项的列表将兼容,但不兼容。(幸运的是,这篇文章最后一个片段引起了更多的混乱。)