我知道 usingtemplates
是一种受欢迎的重载方式,但我想知道为什么auto
不能用于函数参数类型推导从而帮助函数重载?
N3690
在 7.6.1.4/3 中说 lambda 表达式可以使用 auto 进行泛型,提供这个例子
auto glambda = [](int i, auto a) { return i; };//OK: a generic lambda
(注意:N3485中没有提到这个)
1).为什么我不能为正常功能做类似的事情,例如
void swap(auto& param1, decltype(param1)& param2)
{
decltype(param1) temp = param1;
param1 = param2;
param2 = temp;
}
这给出了错误error : parameters declared auto
。
从 N3690 7.1.6.4/4
使用 auto 或 decltype(auto) 声明的变量的类型是从其初始化程序推导出来的。在块 (6.3)、命名空间范围 (3.3.6) 和 for-init-statement (6.5.3) 中声明变量时,允许使用此用法。[...]
我是否错误地假设param1
andparam2
属于块范围并因此有资格自动扣除?
2)。如果允许这样的功能,会有什么陷阱?
我正在使用 gcc 4.8.1。
谢谢