2013-06-09 12 views
16

、APIをより理解しやすくするための例です:C++ const修飾の多くの利点の中で右辺値参照とのconst修飾子

template<typename T> int function1(T const& in); 
// clearly, the input won’t change through function1 

右辺値参照の導入に伴い、1は完全な転送の恩恵を受けることが多いのconst修飾子することができます例:

template<typename T> int function2(T&& in); 
// can explicitly forward the input if it's an rvalue 

function2が入力を変更しないことを説明する良い方法はありますか?

+5

他の人にパラメータを転送しているだけの場合、 'const'とは何を気にしていますか?あなたは彼らにそれに対処させます。 –

答えて

28
template<typename T> int function2(T&& in); 
// can explicitly forward the input if it's an rvalue 

、 機能2は、その入力を変更しないことを説明するための良い方法はありますか?

はい。 C++ 03解決策に固執:完璧なフォワーディングの

template<typename T> int function1(T const& in); 
// clearly, the input won’t change through function1 

メリットあなたは何かがconstまたは非const、左辺値または右辺値である場合を前提としないことです。何かが変更されていないことを強制したい場合(すなわち、それがconstである場合)、constを明示的に追加してください。

あなたがこれを行うことができます:

template<typename T> int function1(T const&& in); 
// clearly, the input won’t change through function1 

しかしあなたは右辺値参照を使用した理由だろうあなたのコードを読んで、誰も。 function1は左辺値の受け入れをやめます。代わりにconst &を使用してください。誰もが理解します。シンプルでよく理解されているイディオムです。

完全に転送したくありません。あなたは不変性を強制したい。

9

あなたはこれを言うことができます:あなたが何か持って

template <typename T> 
typename std::enable_if<immutable<T>::value, int>::type 
function(T && in) 
{ 
    // ... 
} 

:ユニバーサル参照はいずれかのconst参照である場合

template <typename T> struct immutable 
: std::integral_constant<bool, !std::is_reference<T>::value> {}; 

template <typename U> struct immutable<U const &> 
: std::true_type {}; 

この方法では、テンプレートのみを使用できます(そうT = U const &)または右辺値参照(Tは参考値ではありません)。引数を変更する予定がない場合は、言っ


、あなただけT const &を使用することができますし、一時的な値にmutablyの結合から得られるために何もないことから、それを行うこと。別にドキュメントから

関連する問題