2016-01-26 27 views
1

很簡單。爲什麼會發生?它工作正常將所有其他整數類型。運算符<<是模糊打印枚舉值與基礎類型短

enum : unsigned short { 
    ushort_min = static_cast<unsigned short>(0u), 
    ushort_max = static_cast<unsigned short>(~0u) 
}; 

enum : short { 
    short_min = short(ushort_max << (sizeof(short) * char_bit - 1)), 
    short_max = short(ushort_max >> 1) 
}; 

std::cout << short_min; // BOOM 
+0

當然錯誤信息比「BOOM」多。 –

+0

編譯器告訴我operator <<是不明確的,然後列出所有候選重載(這是所有基本類型)。我認爲標題就足夠了 – DeiDei

+0

@ user1436187 - 'ostream'是一種類型;像幾乎所有的類型一樣,它可以用來定義對象。類型和對象都不能重載。你的建議應該是重載流插入器。 –

回答

1

示例代碼使用gcc編譯沒有錯誤。這裏的答案很可能是「升級你的編譯器」:

$ cat t.C 
#include <iostream> 

enum : unsigned short { 
    ushort_min = static_cast<unsigned short>(0u), 
    ushort_max = static_cast<unsigned short>(~0u) 
}; 

enum : short { 
    short_min = short(ushort_max << (sizeof(short) * 8 - 1)), 
    short_max = short(ushort_max >> 1) 
}; 

int main() 
{ 
    std::cout << short_min; // BOOM 
} 
$ g++ -std=c++14 -c -o t.o t.C 
$ g++ --version 
g++ (GCC) 5.3.1 20151207 (Red Hat 5.3.1-2) 
Copyright (C) 2015 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
+0

Ehm,我使用最新的Clang,我更傾向於信任。 – DeiDei

+0

「最新」是您的「最新」。我的大約一個月的時間,由構建時間戳證明。 –

+0

Clang確實重現了libstdC++和libC++。 –