1.重载函数调用问题中的枚举类型提升
1 void newf(unsigned char); 2 void newf(int); 3 unsigned char uc = 129; 4 newf(VIRTUAL); // calls newf(int) 5 newf(uc); // calls newf(unsigned char)
枚举类型 Tokens 只有两个枚举成员, 最大的值为 129。 这个值可以用 unsigned char 类型表示,很多编译器会将这个枚举类型存储为 unsigned char 类型。然而,枚举成员 VIRTUAL 却并不是 unsigned char 类型。就算枚举成员的值能存储在 unsigned char 类型中,枚举成员和枚举类型的值也不会提升为 unsigned char 类型。
2.“仅当形参是引用或指针时,形参是否为 const 才有影响。”,这是《C++ Primer》中的一句话,如果形参是非const引用,这种情况很好理解,不必多说;如果形参是const引用,理解起来要转个弯,《C++ Primer》中的这段话可以辅助理解:“如果传递的是非 const 对象,则上述任意一种函数皆可行。非 const 对象既可用于初始化 const 引用,也可用于初始化非 const 引用。但是,将 const 引用初始化为非 const 对象,需通过转换来实现,而非 const 形参的初始化则是精确匹配。”。有了这段话,下面这两个重载函数的调用就不会混淆:
1 Record lookup(Account&); 2 Record lookup(const Account&); // new function 3 const Account a(0); 4 Account b; 5 lookup(a); // calls lookup(const Account&) 6 lookup(b); // calls lookup(Account&)
另外,“对指针形参的相关处理如出一辙。”,“注意不能基于指针本身是否为 const 来实现函数的重载:”,譬如如下代码:
1 f(int *); 2 f(int *const); // redeclaration
“此时,const 用于修改指针本身,而不是修饰指针所指向的类型。”