Skip to content

Latest commit

 

History

History
106 lines (84 loc) · 2.79 KB

decay.md

File metadata and controls

106 lines (84 loc) · 2.79 KB

decay

  • type_traits[meta header]
  • std[meta namespace]
  • class template[meta id-type]
  • cpp11[meta cpp]
namespace std {
  template <class T>
  struct decay {
    using type = …;
  };

  template <class T>
  using decay_t = typename decay<T>::type; // C++14
}

概要

配列と関数ポインタに関して、関数テンプレートと同様に推論された型を取得する。

このクラステンプレートは、関数テンプレートにおける以下の推論ルールを適用する:

  • 左辺値から右辺値への変換
  • 配列からポインタへの変換
  • 関数の左辺値から関数ポインタへの変換

効果

  • remove_reference<T>::typeした型をUとする。
  • Uが配列型U[N]であれば、U*型をメンバ型typeとして定義する。
  • Uが関数型R(Args...)であれば、R(*)(Args...)型をメンバ型typeとして定義する。
  • それ以外の場合は、remove_cv<U>::typeした型を、メンバ型typeとして定義する。

#include <type_traits>

template <class T1, class T2>
struct my_pair {
  T1 first;
  T2 second;

  template <class U1, class U2>
  my_pair(const U1& a, const U2& b)
    : first(a), second(b) {}
};

template <class T1, class T2>
my_pair<T1, T2> my_bad_make_pair(const T1& a, const T2& b)
{
  return my_pair<T1, T2>(a, b);
}

template <class T1, class T2>
my_pair<
  typename std::decay<const T1>::type,
  typename std::decay<const T2>::type
>
  my_make_pair(const T1& a, const T2& b)
{
  return my_pair<
           typename std::decay<const T1>::type,
           typename std::decay<const T2>::type
          >(a, b);
}

int main()
{
  // コンパイルエラー!
  // 配列をコンストラクタの初期化子で初期化できない
//auto p = my_bad_make_pair("hello", "world");

  // OK
  // decltype(q) == my_pair<const char*, const char*>
  auto q = my_make_pair("hello", "world");

  // OK
  // decltype(a) == mu_pair<int, int>
  auto a = my_make_pair(3, 1);
  a.first = 2;
}
  • std::decay[color ff0000]

出力

バージョン

言語

  • C++11

処理系

  • Clang: 3.0 [mark verified]
  • GCC: 4.4.7 [mark verified]
  • Visual C++: 2010 [mark verified], 2012 [mark verified], 2013 [mark verified], 2015 [mark verified]
    • decay_tは、2013から。

参照