Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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++_Arrays_Initialization_Language Lawyer - Fatal编程技术网

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作为函数声明进行解析,不涉及初始化。