![](/img/trans.png)
[英]Initializing a member of an integer array with a floating point literal in C++
[英]Initializing a const int with a floating point literal
数组绑定必须是一个整型常量表达式,参见8.3.4 [dcl.array] / 1(C ++ 03和C ++ 11中的相同措辞):
如果存在常量表达式(5.19),则它应为整数常量表达式,其值应大于零。
在C ++ 03中,除非转换为整数类型,否则不能通过浮动文字初始化整数常量表达式,请参见5.19 [expr.const] / 1的最后一句:
整数常量表达式只能包含文字(2.13),枚举器,
const
变量或使用常量表达式(8.5)初始化的整数或枚举类型的静态数据成员,整数或枚举类型的非类型模板参数以及sizeof
表达式。 浮动文字(2.13.3)只有在转换为整数或枚举类型时才会出现。
这意味着在C ++ 03中i
不是整数常量表达式,因此不能用作数组绑定。
GCC和Clang允许可变长度数组作为C ++ 03的扩展,因此它使用非常量绑定进行编译,但是会出现-pedantic
警告。 更改常量的初始值设定项以将其强制转换为整型,使得i
成为有效的积分常量表达式:
const int i = (int) 1.0;
通过该更改,数组不再是可变长度,即使使用-pedantic
也没有警告。
在C ++ 11 5.19 [expr.const] / 3中说:
文字常量表达式是文字类型的prvalue核心常量表达式,但不是指针类型。 整数常量表达式是整数或未整数枚举类型的文字常量表达式。
前面(相当冗长的)段落描述了核心常量表达式的规则,但基本上在C ++ 11中,双重初始化器并不会阻止i
成为核心常量表达式,即使没有强制转换,因此它是一个整型常量表达式,因此有效的数组绑定,所以没有警告。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.