簡體   English   中英

C ++顯式積分用戶定義的轉換

[英]C++ explicit integral user-defined conversion

我有一個flags類,女巫只是一個整數的包裝器,我想根據基礎整數類型的轉換規則將顯式轉換為任意整數類型。

說我有上課的方式(忽略無關的成員)

class Flags {
    unsigned int v;
    explicit operator unsigned int() { return v; }
}

除了int說,我還能轉換為整數嗎?

unsigned long long iflags = static_cast<unsigned long long>(flags);

而不是

unsigned long long iflags = static_cast<unsigned int>(flags);

還是我需要為每種整數類型顯式定義一個轉換運算符才能做到這一點?

注意我正在使用C ++ 14

我已經閱讀了http://en.cppreference.com/w/cpp/language/cast_operator,但是看不到特定於整數類型的任何東西,這使我認為我需要顯式定義所有想要避免的有效轉換。 我也對模板轉換函數感到滿意,如果無法轉換為目標類型,該函數將失敗,請注意,我知道內部整數的最大值,即所有標志位均已打開,作為宏/常量FLAGS_MAX ,如果這樣做有什么用。

除了int說,我還能轉換為整數嗎?

 unsigned long long iflags = static_cast<unsigned long long>(flags); 

不,你不能。

以上等同於:

unsigned long long temp(flags);
unsigned long long iflags = temp;

第一行是錯誤的,因為不能將flags隱式轉換為unsigned long long

給定Flags的定義,初始化iflags的唯一合法C ++方法是使用:

 unsigned long long iflags = static_cast<unsigned int>(flags);

如果從轉換運算符中刪除explicit限定詞

class Flags {
    unsigned int v;
    public:
       operator unsigned int() { return v; }
}

那么你可以使用

unsigned long long iflags = static_cast<unsigned long long>(flags);

static_cast嘗試屬於[expr.static.cast] / 4 ,它粗略地說,如果可以執行T t(e);則可以執行static_cast<T>(e) T t(e); 對於某些發明的變量t (在措辭中有一些有趣的舞蹈,可以保證有保證的省略和C樣式的轉換奇數,我們可以忽略它們。)

該初始化由[dcl.init] /17.7控制 ,它表示您對Flags的轉換函數進行重載解析,並帶有指向[over.match.conv]的指針,該指針對候選者有這樣的說明:

那些未隱藏在[ Flags ]中並產生類型[ unsigned long long ]或可以通過標准轉換序列轉換為類型[ unsigned long long ]的類型的非顯式轉換函數是候選函數。 對於直接初始化,未隱藏在[ Flags ]中並產生類型[ unsigned long long ]的顯式轉換函數或可以通過限定轉換轉換為類型[ unsigned long long ]的類型也是候選函數。

您的explicit operator unsigned int()既不會產生unsigned long long也不會產生可通過限定轉換將其轉換為類型的類型(此處無關緊要-轉換僅適用於指針y的事物); 因此,它不是候選人。 由於候選集為空,因此重載解析失敗,因此初始化static_cast不正確, static_cast也是如此。

暫無
暫無

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

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