2016-04-27 21 views
1

コンパイラがテンプレートのインスタンス化に関する警告を私に与える理由はわかりません。std :: forwardテンプレート付きオーバーロード関数

はうまく動作し、適切に左辺値/右辺値を出力コードの一部厥:

//template<typename T> 
void overloaded(const /*T*/std::string& in) 
{ 
    std::cout << "lvalue" << std::endl; 
} 

//template<typename T> 
void overloaded(/*T*/std::string&& in) 
{ 
    std::cout << "rvalue" << std::endl; 
} 

template<typename T> 
void pass(T&& in) 
{ 
    overloaded(std::forward<T>(in)); 
} 

int main() 
{ 
    std::string a; 
    pass(a); 
    pass(std::move(a)); 
    getchar(); 
} 

をしかし、私は、テンプレートの種類とそれを使用する必要があります。だから、

template<typename T> 
void overloaded(const T& in) 
{ 
    std::cout << "lvalue" << std::endl; 
} 

template<typename T> 
void overloaded(T&& in) 
{ 
    std::cout << "rvalue" << std::endl; 
} 

に「オーバーロードされた」の機能を変更するには、テンプレートのインスタンスの警告、(私にはその明確なTははstdする必要があります::文字列)を与えると、コンソールは、最初の左辺値の2倍の代わりに、右辺値を出力します。私が間違っているのは何

+0

私のために働きます。 http://coliru.stacked-crooked.com/a/fc00c140c9a8e208 – erip

+0

'T &&'は転送参照です。つまり、 'T'が型テンプレートパラメータであれば、それはもはや通常の参照値ではありません –

答えて

1

T&&のようなテンプレートは特別です。これらは「転送参照」と呼ばれます。

template<typename T> 
void overloaded(T&& in) 

overloadedが過負荷になっていないこと瞬間のために仮定します。彼らは、同様の機能のための特別控除のルールを持っています。左辺値式 std::stringoverloadedに渡すと、 Tstd::string&と推定されます。右辺の式 std::stringoverloadedに渡すと、 Tstd::stringに推論します。何か他のものと T&&テンプレートをオーバーロードするためにアンチパターンである、一般的に

template<typename T> 
void overloaded(T&& in) 
{ 
    if (std::is_lvalue_reference<T>::value) 
     std::cout << "lvalue" << std::endl; 
    else 
     std::cout << "rvalue" << std::endl; 
} 

:あなたはこれを行うには、この知識を使用することができます。これらの特別なテンプレートは、すべてをキャッチしたいときに便利です。

+0

うわー、私は完全に認識されませんでしたその!ありがとう! – Pancake

関連する問題