としての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
を取り除くのに役立つでしょうか?
'foo'は、そのパラメータを変更したり、その所有権を取得しません。 'const'参照も受け付けるものとして宣言してください。ここで転送のリファレンスを受け入れる理由はありません。 – StoryTeller
'std :: tuple && t 'はフォワーディングリファレンスではありません。 –
Holt
@StoryTellerは実コードで転送するので、私はrvalue referenceが必要です。コード例を変更しました。 – Sergey