1. ホーム
  2. c++

[解決済み】std::decayとは何ですか、またどのような場合に使用するのですか?

2022-04-06 05:24:10

質問

が存在する理由は何でしょうか? std::decay ? どのような場面で std::decay は有用ですか?

解決方法は?

<サブ ジョークです。 std::atomic を非放射性のものに変えることができます。

N2609 を提案した論文です。 std::decay . この論文では、次のように説明しています。

簡単に言うと decay<T>::type を除いては、同一型変換です。 Tが配列型または関数型への参照である場合。このような場合 この場合 decay<T>::type はポインタまたは関数へのポインタを生成します。 それぞれ

動機となる例は、C++03 std::make_pair :

template <class T1, class T2> 
inline pair<T1,T2> make_pair(T1 x, T2 y)
{ 
    return pair<T1,T2>(x, y); 
}

は、文字列リテラルを動作させるために、パラメータを値で受け入れました。

std::pair<std::string, int> p = make_pair("foo", 0);

もし、パラメータを参照で受け付けたのであれば T1 は配列型と推論され、その上で pair<T1, T2> は不正な形式となります。

しかし、これは明らかに大きな非効率をもたらします。そのため decay これにより、パラメータを参照で受け取る効率性を確保しつつ、コードが文字列リテラル、配列型、関数型などで動作するために必要な型変換を行うことができます。

template <class T1, class T2> 
inline pair< typename decay<T1>::type, typename decay<T2>::type > 
make_pair(T1&& x, T2&& y)
{ 
    return pair< typename decay<T1>::type, 
                 typename decay<T2>::type >(std::forward<T1>(x), 
                                            std::forward<T2>(y)); 
}

これは実際のC++11ではありません make_pair の実装 - C++11 make_pair もアンラップされます。 std::reference_wrapper s.