我什么时候可以使用显式运算符bool而无需强制转换?

Tob*_*ght 29 c++ implicit-conversion

我的班级明确转换为bool:

struct T {
    explicit operator bool() const { return true; }
};
Run Code Online (Sandbox Code Playgroud)

我有一个例子:

T t;
Run Code Online (Sandbox Code Playgroud)

要将它分配给类型的变量bool,我需要编写一个强制转换:

bool b = static_cast<bool>(t);
bool b = bool(t);
bool b(t);  // converting initialiser
bool b{static_cast<bool>(t)};
Run Code Online (Sandbox Code Playgroud)

我知道我可以在没有强制转换的条件下直接使用我的类型,尽管有explicit限定符:

if (t)
    /* statement */;
Run Code Online (Sandbox Code Playgroud)

我还可以tbool没有演员阵容的情况下使用?

Tob*_*ght 40

该标准提到了值可以" 上下文转换为bool "的位置.它们分为四大类:

声明

表达式

编译时测试

运营商需要constexpr为这些:

算法和概念

  • NullablePointer T
    
    Run Code Online (Sandbox Code Playgroud)

    在标准要求满足此概念的pointer类型(例如,a 的类型std::unique_ptr)的任何地方,它可以在上下文中被转换.此外,一个NullablePointer平等和不等式运算符的返回值必须在上下文中可转换为bool.

  • std::remove_if(first, last, [&](auto){ return t; });
    
    Run Code Online (Sandbox Code Playgroud)

    在任何名为Predicate或者模板参数的算法中BinaryPredicate,谓词参数都可以返回一个T.

  • std::sort(first, last, [&](auto){ return t; });
    
    Run Code Online (Sandbox Code Playgroud) 在调用模板参数的任何算法中Compare,比较器参数都可以返回a T.

(source1中,源2)


请注意,const和非const转换运算符的混合可能会导致混淆: