42 as unsigned int 很好地定义为“42U”。
unsigned int foo = 42U; // yeah!
我怎样才能写出“23”,以便清楚它是一个无符号短整数?
unsigned short bar = 23; // booh! not clear!
编辑,以便问题的含义更清楚:
template <class T>
void doSomething(T) {
std::cout << "unknown type" << std::endl;
}
template<>
void doSomething(unsigned int) {
std::cout << "unsigned int" << std::endl;
}
template<>
void doSomething(unsigned short) {
std::cout << "unsigned short" << std::endl;
}
int main(int argc, char* argv[])
{
doSomething(42U);
doSomething((unsigned short)23); // no other option than a cast?
return EXIT_SUCCESS;
}
原文由 moala 发布,翻译遵循 CC BY-SA 4.0 许可协议
你不能。数字文字不能有
short
或unsigned short
类型。当然为了赋值给
bar
,文字的值被隐式转换为unsigned short
。在您的第一个示例代码中,您 可以 使用强制转换显式地进行转换,但我认为很明显会发生什么转换。强制转换可能会更糟,因为对于某些编译器,如果文字值超出unsigned short
的范围,它将消除任何可能发出的警告。再说一次,如果你 想 使用这样的值是有充分理由的,那么平息警告是好的。在您编辑的示例中,它恰好是模板函数而不是重载函数,您确实可以替代强制转换:
do_something<unsigned short>(23)
。使用重载函数,您仍然可以避免强制转换:…但我不建议这样做。如果没有别的,这仅在
unsigned short
版本确实存在时才有效,而使用强制转换的调用执行通常的重载解决方案以找到最兼容的可用版本。