2016-01-21 17 views
8

Quali sono le differenze tra modelli funzione con parametri di riferimento di inoltromodello di funzione abbreviato vs. modello di funzione con param riferimento inoltro

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

e Modelli di Funzione abbreviati?

void auto_fun(auto && a) 
{ 
} 

Posso sostituire Universal_func con auto_fun? Universal_func a auto_fun o sono uguali?

Ho testato il seguente programma. Sembra che entrambi siano uguali.

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 e auto_fun dedotto e ampliato per funzioni simili.

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 

Ci sono differenze? Cosa dice lo standard?

+3

la funzione con parametro auto non è standard C++. – 101010

+1

@ 101010 È C++ 14. – Zereges

+5

@Zereges No, non lo è. Lambdas può avere parametri 'auto' IIRC, ma le funzioni non sono ancora definitive. – hvd

risposta

10

auto in parametri di funzione non è ancora parte del C++ standard, ma alcune versioni recenti di GCC consentono questa estensione come parte del supporto per TS Concetti.

concetti TS riferisce a questo costrutto come modello funzione abbreviato (anche se usato per essere conosciuta come una funzione generica , che immagino era troppo generico termine). Le regole sono forse troppo grandi per scaricare questa risposta, ma dai un'occhiata a [dcl.fct]/16-19 in this draft per tutti i dettagli cruenti.

Paragrafo 16 fornisce una panoramica decente:

Un modello di funzione abbreviato è una dichiarazione di funzione il cui parametro di tipo-list comprende uno o più segnaposto (7.1.6.4). Un modello di funzione abbreviato è equivalente a un modello di funzione (14.6.6) il cui elenco di parametri del modello include un parametro di modello inventato per ogni occorrenza di un segnaposto nella clausola-dichiarazione-parametro, in ordine di aspetto, secondo alle regole seguenti. [Nota: i parametri modello sono anche inventati per dedurre il tipo di una variabile o il tipo di ritorno di una funzione quando il tipo dichiarato contiene segnaposti (7.1.6.4.1). - end note]

Secondo le regole stabilite in tale bozza, le tue due definizioni sono funzionalmente equivalenti.

Prendiamo la funzione con un parametro segnaposto:

void auto_fun(auto && a) 
{ 
} 

e inventare un parametro di modello di sostituirla con:

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

Come si può vedere, questo ha la stessa firma la funzione senza segnaposto:

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