【问题标题】:Check if is const on C++03检查 C++03 上是否为 const
【发布时间】:2012-11-20 03:26:23
【问题描述】:

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

的对象

【问题讨论】:

  • 根据本节的限制,可以使用 const_cast 运算符将表达式转换为自己的类型。 - 5.2.11/2
  • 你实际上误解了你应该做什么和不应该做什么。您不应该抛弃最初声明为const 的对象的常量性。话虽如此,您不能使用is_const(C++11 或您自己的)来检测这一点,因为这只会处理您拥有的引用类型,这可能比实际对象更符合 const 条件。
  • 注意:对象 const(ness) 是在编译时定义的。这不是运行时功能。因此术语check if an object is const 并不是真正正确的术语。您可以根据模板参数 const(ness) 生成不同的代码,但这是编译时功能。注意:强制转换(包括 const_cast)是运行时活动而不是编译时。
  • @LokiAstari:我不确定我是否跟随。只有dynamic_cast 具有运行时行为,所有其他都只是编译时类型转换。
  • @GManNickG:措辞不当。它是一种应用于运行时对象的操作。

标签: c++ c++03


【解决方案1】:

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_typetrue_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; }
};

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

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

【讨论】:

  • std::true/false_type 是 C++11 功能。
  • @mfontanini 是的,我没有想到。我已经为答案添加了必要的解决方法。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 2019-10-10
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 2010-11-01
相关资源
最近更新 更多