左移左移0个位置?

在C中,负值的左移是未定义的行为。 我遇到了两个用英特尔ICC编译的库,其中删除了有问题的代码。 在Clang,Comeau,GCC和MSVC下,相同的代码也没问题。

该标准是否提及左移0位的负值? 它还未定义吗?

(我很好奇的细节是一个0大小的class次,在练习中完全没有任何转变。所以我想知道语言是否模糊,以便允许0左右的左移)。

摘录自C99,包括技术勘误TC1,TC2和TC3 :

6.5.7按位移位运算符

[…]

对每个操作数执行整数提升。 结果的类型是提升的左操作数的类型。 如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义。
E1 << E2的结果是E1左移E2位位置; 腾出的位用零填充。 如果E1具有无符号类型,则结果的值为E1×2 E2 ,比结果类型中可表示的最大值减少一个模数。 如果E1具有带符号类型和非负值,并且E1×2 E2可在结果类型中表示,那么这就是结果值; 否则,行为未定义。

所以,总是未定义。