我将用户定义的转换运算符定义为bool
并在条件中使用它:
struct T {
explicit operator bool() { return true; }
};
int main() {
T t;
return t ? 0 : 1;
}
令我惊讶的是,尽管explicit
编译了(在gcc上)。这是否允许C ++ 11标准?我搜索了标准但却找不到它。
答案 0 :(得分:3)
条件运算符的第一个操作数是上下文转换到bool
([expr.cond]/1
)。其定义如下(引自N3337):
[conv]/3:
出现在这样的上下文中的表达式e
被称为从上下文转换为bool
,并且当且仅当声明时才是格式良好的对于某些人来说,bool t(e);
格式正确 发明了临时变量t
。
因此,上下文转换使用直接初始化规则,允许explicit
用户定义的转换。