检查C ++ 03上是否为const

时间:2012-11-20 03:26:24

标签: c++ c++03

如何在没有C ++ 11 std::is_const的情况下检查对象是否为const?据我所知,我不应该const_cast一个声明的对象 const

1 个答案:

答案 0 :(得分:12)

cppreference上给出了C ++ 11 is_const的示例实现,它看起来像这样:

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

如果您将此定义放在C ++ 03代码中,那么您也可以使用is_const,如果您添加false_typetrue_type的定义(感谢mfonantini指向缺少true_typefalse_type)。如果按如下方式定义它们,您将非常接近C ++ 11中使用的定义:

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; }
};

唯一的区别是静态value仅仅是const,而不是constexpr,但请注意它仍然是一个常量表达式,可以用作模板参数。因此,出于所有实际目的,上面的定义应该适用于C ++ 03。

关于问题的最后一部分:将非const类型转换为const实际上没有问题。 (但是,指针指针或对指针的引用可能会出现非法情况,例如T**无法转换为const T**。)