如果一个对象是没有C 11的std :: is_const的const,据我所知,我不应该const_casting一个被声明为const的对象
解决方法
C11的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; } };
唯一的区别是静态值只是一个const,而不是一个constexpr,但是注意它是一个常量表达式,可以用作模板参数.所以为了所有实际的目的,上面的定义应该在C 03中运行.
关于你的问题的最后一部分:实际上没有问题将const的const类型转换成const. (但是,可能会引发指针或指针引用的非法情况,例如T **不能转换为const T **.)