C++模板与Lambda表达式深度解析
1. 函数重载的歧义问题
在C++中,对相同参数类型的按值传递和按引用传递函数进行重载时,常常会在重载解析过程中产生歧义。例如下面这两个函数:
template <typename T> void whatami(T&& x) {
std::cout << "Something weird" << std::endl;
}
template <typename T> void whatami(T x) {
std::cout << "Something copyable" << std::endl;
}
class C {};
C c;
whatami(c);
只要函数的参数可以被复制(对象 c 是可复制的),这种重载就会产生歧义,调用将无法编译。不过,当一个更具体的函数重载一个更通用的函数时,不会出现这个问题(如 whatami(int) 使用按值传递就没有问题),但为相似通用的函数混合使用两种参数传递类型是不可取的。
此外,还有一种特殊的函数在重载解析顺序中有特殊地位——可变参数函数。可变参数函数使用 ... 来声明,而不是具体的参数,可以用任意数量、任意类型的参数调用(如 printf )。它是最后的重载选择,只有在没有其他重载可用时才会被调用:
超级会员免费看
订阅专栏 解锁全文
1616

被折叠的 条评论
为什么被折叠?



