为什么checked_array_iterator在VS2013中不包含<iterator>但在VS2017中失败?

时间:2017-08-10 13:07:16

标签: c++ visual-studio visual-c++ visual-studio-2013 visual-studio-2017

给出以下代码:

#include <memory>
#include <locale>

int main() {
    auto source = std::make_unique<int[]>(16);
    auto dest = std::make_unique<int[]>(16);
    auto dp = stdext::checked_array_iterator<int*>(dest.get(), 16);
    std::copy_n(source.get(), 16, dp);
    return 0;
}

通过运行cl.exe /EHsc <file>.cpp在Visual Studio 2013上完全编译。但是,在Visual Studio 2017上,cl.exe

会引发以下错误(以及其他错误)
vc12.cpp(7): error C2653: 'stdext': is not a class or namespace name
vc12.cpp(7): error C2065: 'checked_array_iterator': undeclared identifier

为什么这段代码不再编译?

1 个答案:

答案 0 :(得分:0)

根据文档,中包含此内容:https://docs.microsoft.com/en-us/cpp/standard-library/checked-array-iterator-class但您需要#include <iterator>

虽然不是在追求纠正这个问题,但我一直在编写符合标准的符号代码。最好的方法是使用静态分配的数组。这将允许您使用C ++的beginendsize函数来处理它:https://stackoverflow.com/a/33442842/2642059

在某些情况下,如果动态数组是必须的,那么这不是一个好建议,请考虑使用vector。如果你不能容纳一个容器,那么使用unique_ptr是一个很好的方法,但不要依赖于checked_array_iterator更喜欢保持自己的大小:

const size_t sourceSize = 16;
auto source = std::make_unique<int[]>(sourceSize);
auto dest = std::make_unique<int[]>(sourceSize);
std::copy_n(source.get(), sourceSize, dest.get())