Проверьте, является ли const на C++03
Как проверить, является ли объект const без std::is_const
C++11? Насколько я знаю, я не должен быть const_cast
ing объектом, который был объявлен const
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
, а не aconstexpr
, но обратите внимание, что это постоянное выражение, тем не менее, и может использоваться в качестве аргумента шаблона. Таким образом, для всех практических целей приведенное выше определение должно работать в C++03.Что касается последней части вашего вопроса: на самом деле нет никаких проблем с приведением неконстантного типа к const. (Незаконные ситуации могут, однако, возникнуть с указателями на указатели или ссылками на указатели, например
T**
не может быть приведено кconst T**
.)