为什么const_cast<iterator>(const_iterator)在Visual C++ 6.0中有效,而在Visual Studio .NET中不起作用?

Why does const_cast<iterator>(const_iterator) work in Visual C++ 6.0, but not in Visual Studio .NET?

本文关键字:Visual iterator const 有效 而在 Studio NET 不起作用 gt lt cast      更新时间:2023-10-16

我正在尝试使一些旧的C++代码现代化。它最初是在Visual C++ 6.0中构建的。我目前的方法是一次逐步浏览一个版本的Visual Studio,以最大程度地减少每次迭代的代码中断量。

举个例子:

vector<someType>::iterator someFunction(...){
    vector<someType>::const_iterator someConstIterator;
    ...
    return (const_cast<vector<someType>::iterator>(someConstIterator));
}

在Visual C++ 6.0中,它可以很好地编译。在Visual Studio .NET中,我收到以下错误:

错误 C2440:"const_cast":无法从 "矢量::const_iterator"到"矢量::迭代器"

发生了哪些变化?是库更改吗?C++版本更改?

由于const_cast<T>在这里列出的四种特定情况下是允许的,因此您通常无法转换

vector<T>::const_iterator

vector<T>::iterator

除非源和目标类型是指针或类型,仅在 CV 资格方面有所不同。

由于vector<T>::const_iterator不能定义为const vector<T>::iterator,因为vector<T>::const_iterator需要保持可更改性,因此唯一合理的解释是,vector<T>::const_iteratorvector<T>::iterator 都是在 Visual C++ 6.0 库中作为指针进行类型定义的,但 Visual Studio .NET 附带的库已更改。