2013-12-19 30 views
0

这是正确的吗?它使用我的编译器进行编译,但是我被告知它不适用于AIX。C++ const-cast参考

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版本)。

+0

你不需要非const版本。编译器将为非const对象以及const对象调用const版本。不知道AIX上的编译器,但除非你有代码表明存在问题,否则无法诊断它。 –

回答

2

const_cast用于消除变量的常量。那就是如果你有const A& a你可以写A& b = const_cast<A&>(a)。现在您可以修改b或调用非const方法。

在这种情况下,您可以从常规的iterator构建一个const_iterator,即使不使用const_cast,这也是可能的。请记住这些是两种不同的类型,简单地说,const_iterator碰巧可以从iterator构造出来。在这种情况下,C++常量没有太大的作用。

2

iteratorconst_iterator(一般情况下)是不同的类型,所以你不能施放引用。然而,iterator可转换为const_iterator,所以你可以做

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

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

ConstIterator citer = iter; 
return funct(citer);