2016-03-26 4 views
4

は、コードのこの部分を書かれているが[]コンテナ呼び出し演算子に:は、C++のstd ::前方項目3の著書「効果的な近代的なC++」では、

template<typename Container, typename Index> 
decltype(auto) 
authAndAccess(Container&& c, Index i) 
{ 
    authenticateUser(); 
    return std::forward<Container>(c)[i]; 
} 

私はあなたの理由を理解していませんstd::forwardに電話しますか? cが値の参照である場合、左辺値ではなく右辺値でoperator[]を呼び出すにはどうなりますか?私にとってはc[i]で十分でしょう。

PS:[]コンテナのオペレータは右辺値と左辺値のためにオーバーロードされている可能性があります

template<typename T, typename... Ts> 
std::unique_ptr<T> make_unique(Ts&&... params) 
{ 
    return std::unique_ptr<T>(new T(std::forward<Ts>(params)...)); 
} 

答えて

3

:変数は、関数のパラメータであるとき、私はとstd::forwardの目的を理解しています。

auto Container::opeartor[](int i) && -> Container::value_type&; 
auto Container::opeartor[](int i) & -> Container::value_type&; 

もしそうなら、私たちは、cは右辺値で初期化された場合、我々はCの[]演算子の右辺値のバージョンを呼び出すことを確認します。演算子[]がlvalueとrvaluesに対して異なった振る舞いをするのは一般的ではありませんが、本当に汎用的なコードでは演算子[]に転送する前にstd :: forwardをcに適用する必要があります。

+0

私はコンパイラがcがrvalue refであることを知っていると思いますが、&&がテンプレートパラメータにある場合、あなたの答えは適用可能でしょうか? – Incomputable

+0

cは、変数が設定された後に左辺値になります。 – Thomas

関連する問題