此问题中发生运算符重载,但参数和类型的数量相同

时间:2019-04-18 03:49:53

标签: c++ c++11

以下代码应根据我生成编译错误。因为我认为编译器可能不知道要调用哪个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)

2 个答案:

答案 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;