簡體   English   中英

我什么時候可以在沒有強制轉換的情況下使用顯式運算符 bool?

[英]When can I use explicit operator bool without a cast?

我的班級顯式轉換為 bool:

struct T {
    explicit operator bool() const { return true; }
};

我有一個實例:

T t;

要將其分配給bool類型的變量,我需要編寫一個強制轉換:

bool b = static_cast<bool>(t);
bool b = bool(t);
bool b(t);  // converting initialiser
bool b{static_cast<bool>(t)};

我知道我可以在沒有強制轉換的條件下直接使用我的類型,盡管有explicit限定符:

if (t)
    /* statement */;

我還有什么地方可以在沒有演員的情況下將t用作bool

該標准提到了值可以“根據上下文轉換為bool ”的地方 他們分為四大類:

聲明

  • if (t) /* statement */;
  •  for (;t;) /* statement */;
  •  while (t) /* statement */;
  •  do { /* block */ } while (t);

表達式

  • !t
  •  t && t2
  •  t || t2
  •  t ? "true" : "false"

編譯時測試

對於這些,操作員需要是constexpr

  •  static_assert(t);
  •  noexcept(t)
  •  if constexpr (t)

算法和概念

  • NullablePointer T

    任何地方標准需要滿足這個概念的類型(例如std::unique_ptrpointer類型),它可以被上下文轉換。 此外, NullablePointer的相等和不等運算符的返回值必須在上下文中可轉換為bool

  •  std::remove_if(first, last, [&](auto){ return t; });

    在任何帶有稱為PredicateBinaryPredicate的模板參數的算法中, predicate 參數可以返回一個T

  •  std::sort(first, last, [&](auto){ return t; });
    在任何帶有名為Compare的模板參數的算法中, Compare器參數可以返回一個T

( 來源 1 ,來源2 )


請注意,const 和非常量轉換運算符的混合可能會導致混淆:

暫無
暫無

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

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