为什么我在尝试创建负大小数组时出错?
#include <array>
int main()
{
std::array<int, -1> arr;
}
-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC
我没有错误。这是预期的行为吗?
答案 0 :(得分:19)
不,这不合法。 std::array
的规范没有明确禁止这一点,但由于转换范围缩小,它是非法的。
§14.3.2/ 5:
对于积分或枚举类型的非类型模板参数,转换 允许在转换的常量表达式(5.19)中使用。
§5.19/ 3:
T类型的转换常量表达式是文字常量表达式, 隐式转换为类型T,其中隐式转换(如果有)是 允许在文字常量表达式和隐式转换序列中 仅包含用户定义的转化,左值到右值的转化(4.1), 积分促销(4.5)和积分转换(4.7),而不是缩小 转换(8.5.4)
让GCC抱怨的唯一方法是启用-Wsign-conversion
。这是一个known bug,他们没有采取任何行动来解决它。
在Clang中,您会收到预期的错误消息:
error: non-type template argument evaluates to -1, which cannot be
narrowed to type 'std::size_t' (aka 'unsigned long') [-Wc++11-narrowing]
std::array<int, -1> arr;
答案 1 :(得分:8)
java.text.ParseException: Unparseable date: "2016-05-17T18:52:54.078+0530" (at offset 21)
的类型是:
std::array
使用template<
class T,
std::size_t N
> struct array;
初始化第二个模板参数时,它会隐式转换为非常大的值,因为-1
是std::size_t
(在{{3}指向的C ++中是非法的它应该被诊断出来。)
另一种可能性是您的unsigned
已经过优化。您可以通过向gcc命令行添加arr
标志来确认这一点。
如果您确保-fdump-tree-optimized
未进行优化,我希望您应该获得other answer:
arr