一般来说,重载一个带有 "T&&" 参数的函数模板是不明智的,因为它可以与任何东西绑定,但让我们假设我们仍然这样做:
template<typename T>
void func(const T& param)
{
std::cout << "const T&\n";
}
template<typename T>
void func(T&& param)
{
std::cout << "T&&\n";
}
我的理解是
const T&
重载将被用于常量左值参数,T&&
重载将被用于其他所有参数类型。但是考虑调用包含常量和非常量内容数组的func
时会发生什么:int main()
{
int array[5] = {};
const int constArray[5] = {};
func(array); // calls T&& overload
func(constArray); // calls const T& overload
}
VC10、VC11和gcc 4.7在展示的结果上达成了一致。我的问题是为什么第二次调用会引起
const T&
重载。简单的答案是constArray
里有一个const,但我认为这太简单了。不管选择哪个模板,被推断出来的类型T都是“含5个const int的数组”,因此const T&
重载中param
的类型将是“含5个const int的const数组的引用”。但是名为constArray的数组本身没有被声明为const。那么为什么对func(constArray)
的调用不会引起T&&
重载,从而产生param
类型为“含5个const int的数组的引用”呢?这个问题是由与问题相关的讨论激发出来的,链接为c++模板函数参数推断和函数解析,但我认为该线程被其他问题偏离了轨道,并没有澄清我现在在这里提出的问题。