该表达式(kHit >= kForeground)产生一个具有值true或的布尔值false。当应用一元-时,bool被提升为int,并且转换产生1fortrue或0for false。升级后,符号变为-1或0,然后uchar由外部演员转换为。
请注意,重要的信息是一元operator-不应用于布尔值,但布尔值被转换int为然后应用。这可以用一些模板魔法来测试:
template <typename T, typename U>
struct same_type {
static const bool value = false;
};
template <typename T>
struct same_type<T,T> {
static const bool value = true;
};
template <typename T>
void f( T value ) {
std::cout << "Is int? " << std::boolalpha << same_type<T, int>::value << "\n";
std::cout << "Is bool? " << same_type<T, bool>::value << "\n";
}
int main() {
f(-true);
}
模板通过使用上面的f模板来测试传递参数的类型int(简单到足以理解)。如果我们调用模板作为参数类型推导将设置为表达式的类型。如果您运行该程序,您将看到它打印出.boolsame_typef-trueT-trueIs int? true\nIs bool? false