如何在没有C ++ 11 std::is_const
的情况下检查对象是否为const?据我所知,我不应该const_cast
一个声明的对象 const
答案 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_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
,而不是constexpr
,但请注意它仍然是一个常量表达式,可以用作模板参数。因此,出于所有实际目的,上面的定义应该适用于C ++ 03。
关于问题的最后一部分:将非const类型转换为const实际上没有问题。 (但是,指针指针或对指针的引用可能会出现非法情况,例如T**
无法转换为const T**
。)