我试图devise一个布尔应用安全布尔成语的 包装结构。 解决这个问题的经典实现非常简单:骨架可以是这样的: struct Bool final { Bool() = default; Bool(bool value) : _value{value} {} explicit operator bool() const { return _value; } private: bool _value{false}; }; 我试图改进的部分是Bool是如何构build的。 例如,我想避免隐式缩小devise: Bool b1(45); // yields warnings, but it compiles Bool b2{3}; // not ok by standard 我试图用模板伤害自己,但没有成功。 我怎么能使它工作?
@R的这个答案。 马丁·费尔南德斯(Martinho Fernandes)表示,安全布尔成语在C ++ 11中被明显弃用,因为它可以被简单的 explicit operator bool() const; 根据答案§4 [conv] p3的标准报价: 一个expression式e可以被隐含地转换为一个typesT当且仅当声明T t=e; 对于一些发明的临时variablest (§8.5)来说,是格式良好的。 某些语言结构要求将expression式转换为布尔值。 出现在这样的语境中的expression式e据说被上下文转换为bool , 并且当且仅当声明bool t(e); 对于一些发明的临时variablest(§8.5)来说, 是格式良好的 。 突出显示的部分清楚地显示了“隐式显式强制转换”(在标准中称为“上下文转换”)为@R。 马蒂尼说的。 需要“隐式显式投射”的“某些语言结构”似乎是: if , while ,( §6.4 [stmt.select] p4 ) 二进制逻辑运算符&&和|| ( §5.14 [expr.log.and/or] p1 ) 逻辑否定运算符! ( §5.3.1 [expr.unary.op] p9 ) 条件运算符?: §5.14 [expr.cond] p1 ) static_assert ( §7 […]