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 用于修改指针本身,而不是修饰指针所指向的类型。”
原文链接: https://www.cnblogs.com/tingshuixuan2012/archive/2013/03/30/2991012.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/82651
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!