【问题标题】:Why does const_cast<iterator>(const_iterator) work in Visual C++ 6.0, but not in Visual Studio .NET?为什么 const_cast<iterator>(const_iterator) 在 Visual C++ 6.0 中有效,但在 Visual Studio .NET 中无效?
【发布时间】:2016-05-24 16:15:31
【问题描述】:

我正在尝试对一些旧的 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”:无法从 'vector::const_iterator' 到 'vector::iterator'

发生了什么变化?这是图书馆的变化吗? C++ 版本更改?

【问题讨论】:

  • 可能是在 Visual C++ 6.0 中,vector&lt;T&gt;::iterator 被定义为 T*(这是允许的,但不是必须的),而 vector&lt;T&gt;::const_iterator 被定义为 T const*(这是允许的,但不是必须的)。

标签: c++ visual-studio visual-c++ iterator constants


【解决方案1】:

由于const_cast&lt;T&gt;在四种特定情况下允许listed here,所以一般不能转换

vector<T>::const_iterator

vector<T>::iterator

除非源类型和目标类型是指针或类型,仅在 cv 限定上有所不同。

由于vector&lt;T&gt;::const_iterator 不能定义为const vector&lt;T&gt;::iterator,因为vector&lt;T&gt;::const_iterator 需要保持可变,唯一合理的解释是vector&lt;T&gt;::const_iteratorvector&lt;T&gt;::iterator 在Visual C++ 6.0 库中被typedef 为指针,但 Visual Studio .NET 附带的库已更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    相关资源
    最近更新 更多