Проверьте, является ли const на C++03


Как проверить, является ли объект const без std::is_const C++11? Насколько я знаю, я не должен быть const_casting объектом, который был объявлен const

1 9

1 ответ:

Пример реализации для C++11 is_const приведен на cppreference , и он выглядит так:

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

Если вы поместите это определение в свой код C++03, вы можете использовать is_const там же, если вы добавите определения для false_type и true_type (Спасибо mfonantini за указание на отсутствующие true_type и false_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, а не a constexpr, но обратите внимание, что это постоянное выражение, тем не менее, и может использоваться в качестве аргумента шаблона. Таким образом, для всех практических целей приведенное выше определение должно работать в C++03.

Что касается последней части вашего вопроса: на самом деле нет никаких проблем с приведением неконстантного типа к const. (Незаконные ситуации могут, однако, возникнуть с указателями на указатели или ссылками на указатели, например T** не может быть приведено к const T**.)