以下代码应根据我生成编译错误。因为我认为编译器可能不知道要调用哪个foo()。
#include <iostream>
typedef long long ll;
void foo(unsigned ll) {
std::cout << "1";
}
void foo(unsigned long long) {
std::cout << "2";
}
int main() {
foo(2ull);
}
我希望编译器将foo(unsigned ll)
视为foo(unsigned long long)
。
答案 0 :(得分:8)
此代码中没有发生运算符重载。并且此代码应该可以编译。 typedef
不是宏。它们不仅仅执行令牌的简单文本替换。 typedef
为类型引入了一个替代名称,该替代名称可以在可以使用类型名称的任何地方使用。这个:
void foo(unsigned ll)
是一个名为foo的函数,它使用类型为unsigned int
的单个参数并返回void
。第一个参数的名称为ll
。由于unsigned
已经是 type-specifier (它是unsigned int
的简写),因此将处理参数声明中ll
之后的标识符unsigned
作为要声明的实体的名称。这意味着上面的代码中foo
有两个重载,第一个为foo(unsigned int)
,第二个为foo(unsigned long long)
。通话时
foo(2ull);
过载解析将选择foo(unsigned long long)
,因为参数2ull
的类型为unsigned long long
,这与foo(unsigned long long)
完全匹配...
答案 1 :(得分:0)
此代码没有错。 Typedef用于创建现有类型的别名。它不会在foo(unsigned ll)中将ll与long long互换。 基本上,这里将ll视为参数,并且类型为unsigned int。但是在第二个foo()参数中,类型是unsigned long long。
如果您长时间使用#define ll而不是#define ll,则您的代码将显示编译错误 typedef long long ll;