在[expr.new]/7中有以下短语:
如果转换为表达式后的表达式
std::size_t
是核心常量表达式并且表达式是错误的,则程序是错误的.否则,具有错误表达式的new表达式不会调用分配函数,并通过抛出与类型的处理程序(15.3)匹配的类型的异常来终止std::bad_array_new_length
.
区分错误的核心常量表达式和错误表达式的相关性是什么?
您引用的段落之前的段落表示表达式错误的条件.从本质上讲,它归结为价值是负面还是太大的问题.如果是这样,那就是错误.
一个核心常量表达式是什么编译器能够而且将会在编译时计算.因此,如果相应的表达式可以静态地确定为错误的,则它是编译时错误.如果表达式不是常量,则可能无法在编译期间确定其值.但是,在这种情况下,将在运行时检测到错误,并且错误必须导致异常.