为什么auto不能用于超载功能?

Kou*_*tty 15 c++ overloading auto c++14

我明白使用templates是一种值得赞赏的重载方式,但我想知道为什么auto不能用于函数参数类型推导,从而有助于重载函数?

N3690 在7.6.1.4/3中说,使用auto可以使lambda表达式成为通用的,提供此示例

auto glambda = [](int i, auto a) { return i; };//OK: a generic lambda
Run Code Online (Sandbox Code Playgroud)

(注意:N3485中没有提到)

1).为什么我不能为例如正常功能做类似的事情

void swap(auto& param1, decltype(param1)& param2)
{
     decltype(param1) temp = param1;
     param1 = param2;
     param2 = temp;
}
Run Code Online (Sandbox Code Playgroud)

这给出了错误error : parameters declared auto.

来自N3690 7.1.6.4/4

使用auto或decltype(auto)声明的变量的类型是从其初始化程序推导出来的.在块(6.3),命名空间范围(3.3.6)和for-init-statement(6.5.3)中声明变量时,允许使用此方法.[...]

我错了在假设param1param2归入块范围,因此有资格自动扣除?

2).如果允许这样的功能会有什么陷阱?

我正在使用gcc 4.8.1.

谢谢

For*_*veR 5

n3690 7.1.6.4/2

在这样的声明符有效的任何上下文中,占位符类型可以在decl-specifier-seq,type-specifier-seq,conversion-function-id或trailing-return-type中与函数声明符一起出现.

7.1.6.4/3

如果auto类型说明符出现在lambda表达式的参数声明的decl-specifier-seq中的decl-specifier之一,则lambda是一个通用lambda.

7.1.6.4/4

使用auto或decltype(auto)声明的变量的类型是从其初始化程序推导出来的.在块(6.3),命名空间范围(3.3.6)和for-init-statement(6.5.3)中声明变量时,允许使用此用法.auto或decltype(auto)应作为decl-specifier-seq中的decl-specifiers之一出现,decl-specifier-seq后面应跟一个或多个init-declarators,每个init-declarator都应有一个非空的初始值 - 伊泽尔

7.1.6.4/5

占位符类型也可用于在选择语句(6.4)或迭代语句(6.5)的条件中声明变量,在new-type-id中的type-specifier-seq或新的type-id中-expression(5.3.4),在for-range-declaration中,以及在类定义的成员规范中出现的带括号或等于初始值的静态数据成员(9.4.2).

只有这样的用法才有用.禁止任何其他用法(特别是用于parameter-declaration-clause).

7.1.6.4/6

在本节未明确允许的上下文中使用auto或decltype(auto)的程序格式不正确.