检查C++ 03上是否为const

Vin*_*rta 9 c++ c++03

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

jog*_*pan 12

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

template<class T> struct is_const          : false_type {};
template<class T> struct is_const<const T> : true_type {};
Run Code Online (Sandbox Code Playgroud)

如果你把这个定义放在你的C++ 03代码中,你也可以is_const在那里使用,如果你为false_type和添加定义true_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; }
};
Run Code Online (Sandbox Code Playgroud)

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

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

  • `std :: true/false_type`是C++ 11的一个特性. (3认同)