C ++型付き導出「ピット」の - 参照を無視

かどうか、自動テンプレートの種類は、ほとんどの場合、参照を無視する、推論しません。栗の場合:

template<typename T>
void f(T& param) {
    T temp = param;
    temp = 5;
}

//main函数中:
int x = 2;
int& rx = x;
f(rx);
cout << x;

Tが参照型である場合、割り当てTEMPは、xの値を変更する必要があり、Xは、出力5であるべきである。2つだけのタイプINT Tは、温度が基準コピーではない場合。図2は、最終的な出力です。同じ自動車の導出は、入力されました。唯一の例外:パラメータが全能のポインタであるTは、左の基準値である、左の引数の値ですFは、パラメータ型に上記のコードではT&&、コードが出力5に見出される再実行し、Tは&INTに記載されています。

そこで質問が来ました。
私たちは時々 、型指定された派生は以下のような書き込みコードに似ている、この機能への参照を無視し忘れ:

/*向该函数传入一个容器和一个下标;函数返回位于这个容器该下标位置的元素的引用*/
template<typename Container, typename Index>
auto find_ele(Container& c, Index i) {
    do_sth();
    return c[i];
}

そして、これは次のようにこの機能を使用するには、次のようになります。

find_ele(arr, 3) = 5;

その後、エラーを見つけます。コンパイラは(ARR、3)が残されていない値を割り当てることができませんfind_eleと言うだろう。最もコンテナ演算子[]は、それがあるべきではないへの参照としてT&、次いで自動find_ele戻り型及びC由来[I]を返しますか?騒々しに、入力された導出は、参照の騒々を無視します。戻り値の型がint、int型ではないとされfind_eleそこで、本実施の形態では、推定されました。
あなたが参照として返すようにしたい場合(左の引数の値のみを考慮して)、次のように機能ヘッダーを書くことができます。

//(1)
auto& find_ele(Container& c, Index i)
//(2)
auto find_ele(Container& c, Index i) -> decltype(c[i])
//(3)
decltype(auto) find_ele(Container& c, Index i)

(1)明示的な所定の基準値を返さなければならない。一般decltypeに忠実にその型パラメータが変化せずに戻りますので、(2)及び(3)は、使用decltypeです。

おすすめ

転載: www.cnblogs.com/saltedreed/p/12022576.html