簡體   English   中英

C ++ !! 轉換為布爾

[英]C++ !! conversion to bool

在C ++中有一個結構!! 適用於非bool值將其轉換為bool。 例如:

int n = 12;

if ( !!n )
  std::<<cout << "n is true";
else
  std::<<cout << "n is false";

是否有可以應用的限制,或適用的類型:POD,指針等?

限制是operator! 必須為類型定義(並且它必須生成一個類型,其中也定義了operator!

它適用於可在布爾上下文中計算的任何類型。 算術類型,指針類型(包括指向(成員)(函數)),以及轉換為其中之一的任何東西。 加上枚舉類型, std::nullptr_t可能性和結束,以及我可能忘記的其他東西。 C ++ 11中的4/3定義了上下文轉換為bool的含義,這就是內置operator! 確實。

對於所有這些類型,寫if(!!n)是多余的,你可以寫if(n)具有相同的含義。 !!n對於這樣的類型意味着與bool(n)static_cast<bool>(n);

它也適用於任何具有重載operator!類型operator! 返回一個可以轉換為bool的類型(或者返回一個帶有operator!的類型operator!重載返回bool )。

如果是最左邊的operator! 返回bool以外的類型,那么你可能仍然可以寫if(!!n) ,但!! 不作為bool的轉換。 它充當轉換為返回的任何類型。

其他答案對你的實際問題有好處。

但是,如果您計划使用示例中的代碼來“簡化”代碼(因為它會縮短代碼),我想我會建議您不要這樣做。 相反,簡化含義並檢查整數為零而不是整數的雙重否定。

if (n!=0) 
    { 
      //whatever
    }

明確地針對零進行測試具有獨立性的好處,即您是否記住c ++中使用的“零是假”約定。 請參閱https://stackoverflow.com/q/329582/498253以及以下注釋。

這是因為對我來說, if(!!my_int)不是很清楚 - 它不明顯意味着發生什么,並且在這一點上形成一個分支看起來會導致問題。

上一個片段(以便非常有用的注釋有意義)

bool my_bool = (n != 0) ? true : false; //whichever way you want it to work.
if (my_bool) 
  { 
    //whatever
  }

唯一的限制是某種類型的對象應該可以轉換為bool或整數類型。

例如,下一個類型無法轉換:

struct A
{
  int a;
  float b;
};

但接下來可以:

struct B
{
  int v;
  operator int()
  {
    return v;
  }
};

!! 簡直就是! 運算符應用兩次。 它適用於所有表達式! 可以使用。

編輯:

重載的運算符實例! 假設被實現為邏輯not

暫無
暫無

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

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