[英]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.