9

オブジェクトが C++11 なしで const かどうかを確認するにはどうすればよいstd::is_constですか? 私の知る限り、constと宣言されconst_castたオブジェクトを ingすべきではありません

4

1 に答える 1

12

C++11 の実装例is_constcppreferenceにあり、次のようになります。

template<class T> struct is_const          : false_type {};
template<class T> struct is_const<const T> : true_type {};

この定義を C++03 コードに入れると、とis_constの定義を追加すれば、そこでも使用できます (不足しているとを指摘してくれた mfonantini に感謝します)。次のように定義すると、C++11 で使用される定義に非常に近くなります。false_typetrue_typetrue_typefalse_type

struct true_type {
  static const bool value = true;
  typedef bool value_type;
  typedef true_type type;
  operator value_type() const { return value; }
};

struct false_type {
  static const bool value = false;
  typedef bool value_type;
  typedef false_type type;
  operator value_type() const { return value; }
};

唯一の違いは、 staticvalueは単なるconstであり、 ではありませんがconstexpr、それでも定数式であり、テンプレート引数として使用できることに注意してください。したがって、すべての実用的な目的のために、上記の定義は C++03 でも機能するはずです。

あなたの質問の最後の部分について:実際には、非 const 型を const にキャストしても問題はありません。(ただし、ポインタへのポインタまたはポインタへの参照では、不正な状況が発生する可能性があります。たとえば、T**にキャストできませんconst T**。)

于 2012-11-20T03:33:19.143 に答える