2016-01-21 8 views
8

Каковы различия между шаблонов функций с эталонных параметрами экспедиторскойСокращенного шаблон функции по сравнению с шаблоном функции с эталонными экспедиторскими парами

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

и сокращенных функциями шаблонов?

void auto_fun(auto && a) 
{ 
} 

Могу ли я заменить Universal_func с auto_fun? Is Universal_func a из 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 

Есть ли разница? Что говорит стандарт?

+3

функция с параметром auto не является стандартным C++. – 101010

+1

@ 101010 Это C++ 14. – Zereges

+5

@ Zereges Нет, это не так. Lambdas может иметь параметры 'auto' IIRC, но функции определенно еще не установлены. – hvd

ответ

10

auto в функциональных параметрах еще не является частью стандартного C++, но некоторые последние версии GCC разрешают это как расширение как часть поддержки TS концепций.

Понятие ТС относится к этой конструкции в качестве шаблона сокращенно функций (хотя раньше известной как родовой функции, который я предполагаю было слишком общий термин). Правила, возможно, слишком велики, чтобы свалить на этот ответ, но посмотрите в [dcl.fct]/16-19 в this draft для всех деталей gory.

Пункт 16 обеспечивает достойный обзор:

Сокращенный шаблон функции является объявлением функции которого параметр типа-список включает в себя один или несколько заполнителей (7.1.6.4). Шаблон сокращенной функции эквивалентен функции шаблону (14.6.6), список шаблонов-параметров которого включает в себя один изобретенный шаблон-параметр для , каждый из которых содержит местозаполнитель в объявлении параметра, в порядке появления, согласно к приведенным ниже правилам. [Примечание: параметры шаблона также придуманы для вывода типа переменной или возвращаемого типа функции, когда объявленный тип содержит заполнители (7.1.6.4.1). - примечание окончания)

По правилам, изложенным в этом проекте, ваши два определения функционально эквивалентны.

Мы возьмем функцию с параметром заполнителем:

void auto_fun(auto && a) 
{ 
} 

И выдумывать параметр шаблона, чтобы заменить его:

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

Как вы можете видеть, это имеет ту же сигнатуру, что ваша функция без заполнителей:

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