负尺寸数组没有错误

时间:2016-05-18 04:26:15

标签: c++ arrays c++11 stdarray

为什么我在尝试创建负大小数组时出错?

#include <array>

int main()
{
    std::array<int, -1> arr;
}

-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC我没有错误。这是预期的行为吗?

2 个答案:

答案 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; 初始化第二个模板参数时,它会隐式转换为非常大的值,因为-1std::size_t(在{{3}指向的C ++中是非法的它应该被诊断出来。)

另一种可能性是您的unsigned已经过优化。您可以通过向gcc命令行添加arr标志来确认这一点。

如果您确保-fdump-tree-optimized未进行优化,我希望您应该获得other answer

arr