C++ 阵列是否禁止直接初始化?
语言律师方面,标准中的哪一条款禁止以下代码:C++ 阵列是否禁止直接初始化?,c++,arrays,initialization,language-lawyer,C++,Arrays,Initialization,Language Lawyer,语言律师方面,标准中的哪一条款禁止以下代码: int arr[] (10, 42); 这将产生一个由10个元素组成的数组,每个元素初始化为42个元素。8.5/14: 如果要初始化的实体没有类类型,则带括号的初始值设定项中的表达式列表应为单个表达式 8.5/14: 如果要初始化的实体没有类类型,则带括号的初始值设定项中的表达式列表应为单个表达式 语言律师智慧,8.5/17: -如果初始值设定项是一个(非圆括号)带括号的初始列表,则对象或引用将被列表初始化(8.5.4) -如果目的地类型为参考类
int arr[] (10, 42);
这将产生一个由10个元素组成的数组,每个元素初始化为42个元素。8.5/14:
如果要初始化的实体没有类类型,则带括号的初始值设定项中的表达式列表应为单个表达式
8.5/14:
如果要初始化的实体没有类类型,则带括号的初始值设定项中的表达式列表应为单个表达式
语言律师智慧,8.5/17: -如果初始值设定项是一个(非圆括号)带括号的初始列表,则对象或引用将被列表初始化(8.5.4) -如果目的地类型为参考类型,请参见8.5.3 -如果目标类型是字符数组、char16\u t数组、char32\u t数组或 wchar_t数组,初始值设定项为字符串文字,请参见8.5.2 -如果初始值设定项为(),则对象的值已初始化 -否则,如果目标类型是数组,则程序格式错误
括号内的init列表是{},其中任何内容(或任何内容)都可以位于括号内(例如,
int-arr[3]={1,2,3}
)。考虑到这一点,前4个选项都不适用于int-arr[](10,42)代码>,留下最后一个表示程序格式不正确。语言律师智慧,8.5/17:
-如果初始值设定项是一个(非圆括号)带括号的初始列表,则对象或引用将被列表初始化(8.5.4)
-如果目的地类型为参考类型,请参见8.5.3
-如果目标类型是字符数组、char16\u t数组、char32\u t数组或
wchar_t数组,初始值设定项为字符串文字,请参见8.5.2
-如果初始值设定项为(),则对象的值已初始化
-否则,如果目标类型是数组,则程序格式错误
括号内的init列表是{},其中任何内容(或任何内容)都可以位于括号内(例如,int-arr[3]={1,2,3}
)。考虑到这一点,前4个选项都不适用于int-arr[](10,42)代码>,留下最后一个表示程序格式不正确。int arr[10];标准:填充(arr,10,42)代码>对内置数组进行实际初始化所能获得的最佳结果可能是int arr_0[]={MAGIC_REPEAT_MACRO(10,42)}代码>。IIRC,BOOST\u PP\u REPEAT
将允许这样做。DUPE实际上不包含C++中的初始化,使用<代码> CONTXPRPR <代码>,请高兴:编写一个构建数组的constepr
函数,从初始值设定项调用它。@user3791991:为什么认为(10,42)
意味着“生成10个元素,每个元素初始化为42”?没有编译器会将第一个值视为计数,将下一个值视为初始值设定项std::vector
有一个接受这些值的构造函数,例如std::vector arr(10,42)代码>,但普通数组则不然。@RemyLebeau,如果假设的原因是这些内置类型“缺少构造函数”,那么为什么int num(10)代码>工作?这看起来也像一个构造函数调用;标准:填充(arr,10,42)代码>对内置数组进行实际初始化所能获得的最佳结果可能是int arr_0[]={MAGIC_REPEAT_MACRO(10,42)}代码>。IIRC,BOOST\u PP\u REPEAT
将允许这样做。DUPE实际上不包含C++中的初始化,使用<代码> CONTXPRPR <代码>,请高兴:编写一个构建数组的constepr
函数,从初始值设定项调用它。@user3791991:为什么认为(10,42)
意味着“生成10个元素,每个元素初始化为42”?没有编译器会将第一个值视为计数,将下一个值视为初始值设定项std::vector
有一个接受这些值的构造函数,例如std::vector arr(10,42)代码>,但普通数组则不然。@RemyLebeau,如果假设的原因是这些内置类型“缺少构造函数”,那么为什么int num(10)代码>工作?这看起来也像是一个构造函数调用代码>这是不允许的?我认为这不适用于intarr[](表达式)
这是不允许的?在第4种情况下,()
是否意味着括号内不能有表达式?@user3791991这是正确的,但值得注意的是空格可以在括号内parens@Falias,那么,为什么下面的语句将目标类型初始化为1(已验证)<代码>int num()
@user3791991被解析为函数声明,不涉及初始化。在第4种情况下,()
是否意味着括号内不能有表达式?@user3791991是正确的,但值得注意的是,空格可以在括号内parens@Falias,那么,为什么下面的语句将目标类型初始化为1(已验证)int num();
@user3791991作为函数声明进行解析,不涉及初始化。