c++タイプ導出シリーズの3:decltypeについて

1336 ワード

名前や式をあげると、decltypeは名前や式のタイプを教えてくれます.decltypeは非常に誠実で、cv識別子、参照識別子などを勝手に追加したり削除したりすることはありません.言い換えれば、decltypeで得られるタイプは名前や式のタイプです.(テンプレートタイプ導出やauto導出のように,導出されるタイプをいくつかの要因で決定する必要はない)decltypeもタイプ導出法則と見なすことができる.c++11標準ではdecltypeの役割は主に末尾戻りタイプ宣言関数テンプレートの戻りタイプに合わせて行われます.
template
auto authAndAccess(Container& c,Index i) ->decltype(c[i]) {
    autoenticateUser();
    return c[i];
}

c++14規格では、導出関数の戻りタイプ、すなわちautoを保持し、->decltype(c[i])を除去することができる.注意:c++14では、関数戻りタイプをautoと宣言することで、ここでタイプ導出を行うことを示していますが、ここでのタイプ導出ルールはautoタイプ導出ルールではなく、テンプレートタイプ導出ルールを採用しています.authAndAccess関数は次のように書くことができます.
template
auto authAndAccess(Container& c,Index i) {
    autoenticateUser();
    return c[i];
}

この関数は実際には問題があり、テンプレートタイプ導出規則に基づいてautoはここで非参照タイプとして導出され、c[i]は参照タイプを返す.次の関数は目的を達成できません.
std::deque d;
autoAndAccess(d,5) = 10; //   rvalue      。

この問題を解決するために、c++14は新しい識別子:decltype(auto)を拡張し、関数が以下の形式に変更された場合:
template
decltype(auto) authAndAccess(Container& c,Index i) {
    autoenticateUser();
    return c[i];
}

説明関数に相当する戻りタイプは、テンプレートタイプ導出法則ではなくdecltypeタイプ導出法則を使用し、すなわち戻りタイプはdecltype(c[i])である.