我知道这个问题在 SO 中被问过很多次,但这是与其他问题的不同之处。
xutility(2227): 警告 C4996: 'std::_Copy_impl'
失败的代码片段
DWORD dwNumberOfNames = pExportDirectory->NumberOfNames;
LPDWORD dwNames = (LPDWORD)((LPBYTE)hDLL + pExportDirectory->AddressOfNames);
std::vector< std::string > exports;
std::copy(
dwNames,
dwNames + dwNumberOfNames,
[&exports, &hDLL](DWORD dwFuncOffset)
{
std::string fname = std::string((PCHAR)((PBYTE)hDLL + dwFuncOffset));
exports.push_back(fname);
}
);
编译器错误
错误 1 错误 C4996:“std::_Copy_impl”:带有可能不安全参数的函数调用 - 此调用依赖于调用者检查传递的值是否正确。要禁用此警告,请使用 -D_SCL_SECURE_NO_WARNINGS。请参阅有关如何使用 Visual C++ 'Checked Iterators' C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xutility 2176 的文档
问题
考虑到C4996,意味着该功能被标记为已弃用 问题出在哪里?
- MS认为是不安全并且会被弃用的std :: copy的使用吗?
- 是因为我用过
std::copy
吗C Array
? - 是因为我使用 Lambda 表达式的方式吗?
- 如果不推荐使用 std::copy ,如果我需要便携,还有什么替代方法。
笔记
我知道,如何抑制警告,但我很想知道问题的根本原因?
此外,对我来说同样重要的是,在不影响代码质量的情况下处理此问题的可移植方式。