考虑以下程序:
// http://ideone.com/4I0dT
#include <limits>
#include <iostream>
int main()
{
int max = std::numeric_limits<int>::max();
unsigned int one = 1;
unsigned int result = max + one;
std::cout << result;
}
和
// http://ideone.com/UBuFZ
#include <limits>
#include <iostream>
int main()
{
unsigned int us = 42;
int neg = -43;
int result = us + neg;
std::cout << result;
}
+运算符如何“知道”返回哪种类型?通常的规则是将所有参数转换为最宽的类型,但在这里,int
和unsigned int
之间没有明显的“赢家”。在第一种情况下,operator+
的结果必须选择unsigned int
,因为我得到了一个结果为2147483648
。而在第二种情况下,它必须选择int
,因为我得到了一个结果为-1
。然而,在一般情况下,我不知道这是如何可判定的。我看到的是未定义的行为,还是其他什么情况?
std::cout << typeid(x + y).name()
可以快速告诉你一个表达式的类型,至少如果你知道你的实现给不同整数类型的名称。不需要从值中尝试弄清楚它。 - Steve Jessoptemplate<typename T> void func(T t) { static_assert(std::is_empty<T>::value, "testing"); }
并将表达式放入函数中,从编译器获取类型。 - Trevor Boyd Smith