2016-01-21 15 views
8

フォワーディング参照パラメータ転送参照のparamを持つ関数テンプレート対略称関数テンプレートに

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

簡略関数テンプレート関数テンプレートの違いは何ですか?

void auto_fun(auto && a) 
{ 
} 

私はauto_funUniversal_funcを置き換えることはできますか? auto_funまたはそれらが等しいのUniversal_funcですか?

私は、以下のプログラムをテストしました。両方が同じであるようです。

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 

違いがありますか?スタンダードとは何ですか?

+3

パラメータautoの関数は標準C++ではありません。 – 101010

+1

@ 101010 C++ 14です。 – Zereges

+5

@Zeregesいいえ、そうではありません。 Lambdaは 'auto'パラメータIIRCを持つことができますが、明確に機能していません。 – hvd

答えて

10

autoは、標準C++にはまだ含まれていませんが、GCCの最近のバージョンでは、これをコンセプトTSのサポートの一部として拡張として認めています。 (それは私はあまりにも一般的な用語であった推測汎用関数、として知られるように使用されるが)

概念TSは、略記関数テンプレート、この構築物を意味します。ルールはこの答えにダンプする、おそらく大きすぎるが、すべての血みどろの詳細については、this draft[dcl.fct]/16-19で顔をしています。

パラグラフ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) 
{ 
} 
関連する問題