缩写函数模板与带有转发引用参数的函数模板
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_func
是 auto_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_func
和 auto_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)
{
}
两者有什么区别 带有转发引用参数的函数模板
template<typename T>
void Universal_func(T && a)
{
}
和缩写函数模板?
void auto_fun(auto && a)
{
}
我可以用 auto_fun
替换 Universal_func
吗? Universal_func
是 auto_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_func
和 auto_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)
{
}