Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在聚合扣减中不支持大括号初始列表,但支持大括号省略?_C++_Language Lawyer_C++20 - Fatal编程技术网

C++ 为什么在聚合扣减中不支持大括号初始列表,但支持大括号省略?

C++ 为什么在聚合扣减中不支持大括号初始列表,但支持大括号省略?,c++,language-lawyer,c++20,C++,Language Lawyer,C++20,为什么在聚合扣减中不支持大括号初始列表,但支持大括号省略 #包括 模板 结构测试{ T[2]; }; int main(){ 测试t{{1,2};/#1 //测试t1{1,2}/#2 } #1由GCC提供,而#2则由GCC提供 据 此外,如果定义了C,并且其定义满足聚合类([dcl.init.aggr])的条件,并且假设任何依赖基类都没有虚函数和虚基类,并且初始值设定项是非空的括号内init列表或括号内表达式列表,并且C没有演绎指南,该集合包含一个额外的函数模板,称为聚合扣减候选函数,定义如下

为什么在聚合扣减中不支持大括号初始列表,但支持大括号省略

#包括
模板
结构测试{
T[2];
};
int main(){
测试t{{1,2};/#1
//测试t1{1,2}/#2
}
#1
由GCC提供,而
#2
则由GCC提供

此外,如果定义了C,并且其定义满足聚合类([dcl.init.aggr])的条件,并且假设任何依赖基类都没有虚函数和虚基类,并且初始值设定项是非空的括号内init列表或括号内表达式列表,并且C没有演绎指南,该集合包含一个额外的函数模板,称为聚合扣减候选函数,定义如下。设X1,…,XN是带括号的init列表或表达式列表的初始值设定项列表或指定初始值设定项列表的元素。对于每个席席,让EI是C的相应聚合元素或它的一个(可能递归的)子集合,由XI IF /P>初始化。
  • [1.5]对于具有依赖非数组类型或具有值依赖边界的数组类型的任何聚合元素,不考虑大括号省略,以及
  • [1.6]假设作为包扩展的每个非尾随聚合元素不对应于初始值设定项列表中的任何元素,以及
  • [1.7]假设作为包扩展的尾随聚合元素对应于初始值设定项列表的所有剩余元素(如有)

如果没有任何XI的这种聚合元素EI,则聚合推断席候选不会被添加到集合中。如上所述,从假设的构造函数C(T1,…,Tn)中推导出总扣减候选项

    如果EI是数组类型,席是一个支持的init列表或字符串文字,那么TI是声明类型EI 的RValk引用。
在我的示例中,x1是一个带括号的init列表(
{1,2}
),e1的类型是数组类型T[2],因此构造函数的形式应该是
C(T(&&&&[2])
,可以根据

为什么GCC拒绝上述示例?GCC是否接受大括号省略方式?如何解释这个例子?这被认为是GCC的缺陷还是我误解的东西


另一个问题,我认为奇怪的是,如果XI是一个应该被用来初始化子集合的支持的init列表,如果子弹[1.5 ]是真的,那么席席将被用来初始化子聚合的元素。这是什么意思

更新
在深入挖掘之后。从上下文来看,聚合元素一词似乎是指聚合类型的元素,而不是聚合的元素。IIUC,如果满足项目符号[1.5]、[1.6]、[1.7],ei将是聚合元素。但是,如果这些子弹都不符合要求,ei会是什么?这里的指定似乎不够。

clang拒绝这两个选项,MSVC接受这两个选项,因此3个主要编译器都给出了3个不同的结果。很好。@bolov我觉得Clang拒绝这个例子并不奇怪,因为Clang并不完全支持c++20。因此,我的问题中没有提到叮当声。他们的testsuite中包含几乎相同的代码,只是数组大小也是一个模板参数——在这种情况下,它可以成功编译。@interjay数组类型与值相关的绑定是我想谈论的另一个类型。我不知道bullet[1.5]是否被认为是真的?如果为真,则
ei
将成为数组的元素,其中数组是C的子集合。这似乎有点模糊。@MarkusLenger Clang与C++20不完全兼容。我使用了最新的GCC来测试这样的代码。以及上面第一条注释中的链接中的这些编译器也可以编译此代码。