【问题标题】:C++ const-cast a referenceC++ const-cast 引用
【发布时间】:2013-12-19 13:17:43
【问题描述】:

这是正确的吗? 它可以用我的编译器编译,但有人告诉我它不能用 AIX 编译。

typedef std::vector<Entry>::iterator Iterator;
typedef std::vector<Entry>::const_iterator ConstIterator;

bool funct(ConstIterator& iter) const;
inline bool funct(Iterator& iter){return funct(const_cast<ConstIterator&>(iter));}

我应该怎么做才能让我的代码在 AIX 平台上编译? (除了用 Ctrl-C Ctrl-V 重新实现非 const 版本)。

【问题讨论】:

  • 您不需要非常量版本。编译器将为非常量对象和 const 对象调用 const 版本。不了解 AIX 上的编译器,但除非您的代码表明存在问题,否则实际上无法诊断它。

标签: c++ const-cast


【解决方案1】:

const_cast 用于删除变量的 const-ness。也就是说,如果你有const A&amp; a,你可以写A&amp; b = const_cast&lt;A&amp;&gt;(a)。现在您将能够修改b 或在其上调用非常量方法。

在这种情况下,您从常规的iterator 构造一个const_iterator,即使不使用const_cast,这也总是可能的。请记住,这是两种不同的类型,而 const_iterator 恰好可以从 iterator 构造,在这种情况下,C++ const-ness 没有太多工作要做。

【讨论】:

    【解决方案2】:

    iteratorconst_iterator (通常)是不同的类型,因此您不能转换引用。但是,iterator 可以转换为const_iterator,所以你可以这样做

    return funct(static_cast<ConstIterator>(iter));
    

    或者,更安全,因为它只允许显式转换:

    ConstIterator citer = iter;
    return funct(citer);
    

    【讨论】:

      猜你喜欢
      • 2015-09-30
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多