缩写函数模板与带有转发引用参数的函数模板

Abbreviated function template vs. function template with forwarding reference param

两者有什么区别 带有转发引用参数的函数模板

template<typename T>
void Universal_func(T && a)
{
}

缩写函数模板?

void auto_fun(auto && a)
{
}

我可以用 auto_fun 替换 Universal_func 吗? Universal_funcauto_fun 的一个还是它们相等?

我测试了下面的程序。好像两者是一样的

template<typename T>
void Universal_func(T && a)
{
}

void auto_fun(auto && a)
{
}

int main()
{
  int i;   
  const int const_i = 0; 
  const int const_ref =const_i; 
  //forwarding reference template function example  
  Universal_func(1); //call void Universal_func<int>(int&&)
  Universal_func(i);//call void Universal_func<int&>(int&):
  Universal_func(const_i); //call void Universal_func<int const&>(int const&)
  Universal_func(const_ref);//call void Universal_func<int const&>(int const&)

  //auto calls  
  auto_fun(1); //call void auto_fun<int>(int&&)
  auto_fun(i);//call void auto_fun<int&>(int&):
  auto_fun(const_i); //call void auto_fun<int const&>(int const&)
  auto_fun(const_ref);//call void auto_fun<int const&>(int const&)
  return 0;
}

Universal_funcauto_fun 推导和扩展到类似的功能。

void Universal_func<int>(int&&):
        pushq   %rbp
        movq    %rsp, %rbp
        movq    %rdi, -8(%rbp)
        nop
        popq    %rbp
        ret
void Universal_func<int&>(int&):
        pushq   %rbp
        movq    %rsp, %rbp
        movq    %rdi, -8(%rbp)
        nop
        popq    %rbp
        ret
void Universal_func<int const&>(int const&):
        pushq   %rbp
        movq    %rsp, %rbp
        movq    %rdi, -8(%rbp)
        nop
        popq    %rbp
        ret
void auto_fun<int>(int&&):
        pushq   %rbp
        movq    %rsp, %rbp
        movq    %rdi, -8(%rbp)
        nop
        popq    %rbp
        ret
void auto_fun<int&>(int&):
        pushq   %rbp
        movq    %rsp, %rbp
        movq    %rdi, -8(%rbp)
        nop
        popq    %rbp
        ret
void auto_fun<int const&>(int const&):
        pushq   %rbp
        movq    %rsp, %rbp
        movq    %rdi, -8(%rbp)
        nop
        popq    %rbp
        ret

有什么区别吗?标准怎么说?

函数参数中的

auto 还不是标准 C++ 的一部分,但是一些最新版本的 GCC 允许将其作为扩展作为其对 Concepts TS 支持的一部分。

Concepts TS 将此构造称为缩写函数模板(尽管它过去被称为通用函数,它我想这个词太笼统了)。规则可能太大而无法转储到这个答案中,但请查看 this draft 中的 [dcl.fct]/16-19 以了解所有细节。

第 16 段提供了一个不错的概述:

An abbreviated function template is a function declaration whose parameter-type-list includes one or more placeholders (7.1.6.4). An abbreviated function template is equivalent to a function template (14.6.6) whose template-parameter-list includes one invented template-parameter for each occurrence of a placeholder in the parameter-declaration-clause, in order of appearance, according to the rules below. [ Note: Template parameters are also invented to deduce the type of a variable or the return type of a function when the declared type contains placeholders (7.1.6.4.1). — end note ]

根据该草案中规定的规则,您的两个定义在功能上是等同的。

我们采用带有占位符参数的函数:

void auto_fun(auto && a)
{
}

并发明一个模板参数来替换它:

template <typename T>
void auto_fun (T && a)
{
}

如您所见,这与您的函数具有相同的签名但没有占位符:

template <typename T>
void Universal_func(T && a)
{
}