簡體   English   中英

為什么checked_array_iterator在沒有包含的情況下工作 <iterator> 在VS2013但在VS2017中失敗了?

[英]Why does checked_array_iterator work without including <iterator> in VS2013 but fails in VS2017?

給出以下代碼:

#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

為什么這段代碼不再編譯?

該示例缺少#include <iterator> 從技術上講,Visual Studio 2013也缺少它(請參閱為什么包含您使用的內容 ),但由於其中包含了一系列包含功能。 在Visual Studio 2013和Visual Studio 2017之間, std -headers的包含得到了改進。

該示例顯示了#include <locale> 在舊版本中, #include <iterator>locale包含鏈的一部分,在Visual Studio 2017中不再是這種情況。

然而,目前很難找到VS2017的文檔,因為它是如此新穎。 重要文檔可以在doc.microsoft.com找到,它列出了必需的頭文件<iterator>

這包含在根據文檔: 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())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM