2016-12-19 5 views
2

としてのconst左辺値参照を渡す:私は右辺値参照を受け付ける関数持た右辺値参照

template<typename... Ts> 
void foo(std::tuple<Ts...>&& t) 
{ 
    processFoo(std::forward<std::tuple<Ts...>>(t)); 
} 

と左辺値参照を受け入れる別の関数:

template<typename T> 
void bar(const T& t); 

を私はbarができるようにしたいです左辺値と右辺値の両方にバインドするため、署名はOKです。その後、にtと電話したいと思います。このコードの場合:

template<typename T> 
void bar(const T& t); 
{ 
    foo(t); 
} 

私のコンパイラは、当然、互換性のないCV-修飾子を持つstd::tuple<_blahblahblah>ようとconst std::tuple<_blah>foo(...)への呼び出しに該当する機能がないことを不平を言います。

template<typename T> 
void bar(const T& t); 
{ 
    foo(std::forward<T>(const_cast<T&>(t))); 
} 

しかしconst_castは、回避策のようになります。だから私は、次の操作を行います!

上記の転送コードはOKで慣用的ですか?おそらく、他の参照型やcv修飾子にはfooをオーバーロードする方が良いでしょうか?あるいは、さらに一層普遍的な参照があり、それはconst_castを取り除くのに役立つでしょうか?

+2

'foo'は、そのパラメータを変更したり、その所有権を取得しません。 'const'参照も受け付けるものとして宣言してください。ここで転送のリファレンスを受け入れる理由はありません。 – StoryTeller

+1

'std :: tuple && t 'はフォワーディングリファレンスではありません。 – Holt

+0

@StoryTellerは実コードで転送するので、私はrvalue referenceが必要です。コード例を変更しました。 – Sergey

答えて

4

std::tuple<Ts...> &&フォワーディング参照ではありません前に、これが動作しないことができる、それは簡単な右辺値参照で、あなたは右辺値-refにconstの左辺値-REFをバインドすることはできません - にあなたのコードを変更します。

template<typename Tuple> 
void foo(Tuple&& t) { 
    processFoo(std::forward<Tuple>(t)); 
} 

実際のフォワーディングリファレンスがあり、コードが動作します。

+0

合理的に見えます。ありがとう! – Sergey

関連する問題