我的班级明确转换为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
吗?
答案 0 :(得分:35)
标准提到值可能&#34; 从上下文转换为bool
&#34; 的地方。它们分为四大类:
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
标准要求满足此概念的类型(例如pointer
的{{1}}类型)的任何地方都可以进行上下文转换。此外,std::unique_ptr
的相等和不等运算符的返回值必须在上下文中可转换为NullablePointer
。
bool
在任何名为std::remove_if(first, last, [&](auto){ return t; });
或Predicate
的模板参数的算法中,谓词参数都可以返回BinaryPredicate
。
T
在具有名为std::sort(first, last, [&](auto){ return t; });
的模板参数的任何算法中,比较器参数可以返回Compare
。请注意,const和非const转换运算符的混合会引起混淆: