簡體   English   中英

縮小從int到long unsigned int {}的轉換在C ++ 11中是不正確的

[英]narrowing conversion from int to long unsigned int {} is ill-formed in C++11

當我運行下面的代碼時 - 我收到警告“縮小從int轉換為long unsigned int inside {}在C ++ 11 [-Wnarrowing]中的格式不正確。我正在使用GNU 4.8編譯器。

typedef struct TableEntry
{
    unsigned long value;
    const char *label;
} TableEntry;

enum FunctionType
{
    NORMAL   = 0, 
    RANGE    = 1
};


TableEntry functionTypes[] = 
{
    {NORMAL,   "NORMAL"},
    {RANGE, "RANGE"}
};

我不明白為什么編譯器將enum視為int?
這是GCC 4.8中的錯誤嗎? 有沒有解決方法? 任何幫助表示贊賞。

如果可行的話:

enum FunctionType
{
    NORMAL   = 0, 
    RANGE    = 1
};

typedef struct TableEntry
{
    FunctionType value;
    const char *label;
} TableEntry;


TableEntry functionTypes[] = 
{
    {NORMAL,   "NORMAL"},
    {RANGE, "RANGE"}
};

否則,將struct中的類型更改為int ,或者將枚舉顯式基於與struct中相同的類型。

順便說一句,我認為g ++警告是沒有根據的,因為原始代碼是有效的C ++ 03。 更正:據我所知,診斷是正確的,這是C ++ 11中的一個重大變化。 我簡直不敢相信。


關於命名約定:所有大寫標識符都適用於Java程序員(習慣於該約定),但在C ++中,它們增加了無意中文本替換的可能性。 還有審美方面的考慮因素。 在保留宏的全部大寫方面取得了很大的成功。

通常底層類型的無范圍枚舉是int(它可以是任何可以表示枚舉器的所有值的整數類型)。

但是我沒有看到任何縮小轉換,因為unsigned long類型可以表示int類型的所有值。

編輯:我似乎錯了,因為我發現標准中的一個例子與我的假設相矛盾

unsigned int ui1 = {-1}; // error: narrows

因此,無法使用包含負數的初始化列表初始化unsigned int。

因此,為了避免警告,枚舉可以寫成

enum FunctionType : unsigned int // or unsigned long
{
    NORMAL   = 0, 
    RANGE    = 1
};
  • 你可以將“value”改為int
  • 或者您可以使用強類型的新“枚舉類”(c ++ 11),並將此“值”聲明為此類型。

由於你使用的是c ++ 11,你可以像這樣聲明你的枚舉:
enum Enum2 : unsigned char;
這應該迫使枚舉工作。 也就是說,IDEONE對您發布的代碼沒有警告/錯誤。 可能只是海灣合作委員會過分迂腐。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM