mal*_*lat 13 c++ visual-studio-2013
我在Visual Studio 2013(调试/ Win32编译)下观察到以下行为。考虑以下c ++代码:
#include <iostream>
#include <climits>
int main(int argc, char *argv[])
{
enum { V = (unsigned long long)ULLONG_MAX } E;
std::cout << sizeof E << std::endl;
enum : unsigned long long { W = (unsigned long long)ULLONG_MAX } F;
std::cout << sizeof F << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译后将导致:
$ ./enum.exe
4
8
Run Code Online (Sandbox Code Playgroud)
如果我正确理解c ++标准(Standard C ++ 7.2 / 5),则这是无效的c ++行为。在这种情况下,由于枚举器的值不能适合int或,因此不需要显式定义基础类型unsigned int。
所以:
更新:按照建议,我在以下位置报告了问题:
参考文献的内容如下(重要部分加粗):
声明一个无作用域的枚举类型,其基础类型不固定(在这种情况下,基础类型是实现定义的整型,可以表示所有枚举数值;此类型不大于 int ,除非枚举数的值无法容纳在int 或 unsigned int。如果枚举器列表为空,则基础类型就好像枚举具有值为 0 的单个枚举器。
和
无作用域枚举类型的值可以隐式转换为整型。如果基础类型不固定,则该值可转换为以下列表中能够保存其整个值范围的第一个类型: int、unsigned int、long、unsigned long、long long 或unsigned long long。如果基础类型是固定的,则可以将值转换为其提升的基础类型。
综合起来,很明显这是msvc的一个 bug (可能是在某个时候引入的)。更糟糕的是,它对此保持沉默。
| 归档时间: |
|
| 查看次数: |
217 次 |
| 最近记录: |