gpt4 book ai didi

c++ - 是否有一种安全的方法来迭代 std::unique_ptr

转载 作者:行者123 更新时间:2023-11-30 03:43:57 25 4
gpt4 key购买 nike

在下面的代码中,我收到了 MSVC (C4996) 的警告 std::copy(errors.begin(),errors.end(),pErrors.get());不安全。它写入原始指针。是否有一种优雅且安全的方法来遍历元素?

主要目标是为调用遗留函数准备一个内置数组:

#include <iostream>
#include <initializer_list>
#include <memory>
#include <algorithm>

void print_errors_old_function(int argument_count,int* pErrors)
{
for (int i=0;i<argument_count;++i) { std::cerr << "Error" << pErrors[i] << " "; }
}

void print_errors(std::initializer_list<int> errors)
{
std::unique_ptr<int[]> pErrors{new int[errors.size()]};
std::copy(errors.begin(),errors.end(),pErrors.get()); // warning C4996
print_errors_old_function(errors.size(),pErrors.get());
}

int main()
{
print_errors({234,253,334});
return 0;
}

似乎基于范围的 for 循环是 not possiblestd::unique_ptr<int[]>并且可以说,常规 for 循环的可读性不如 std::copy .

最佳答案

你不需要std::unique_ptrstd::vector 可以正常工作,因为 &v[0] 保证给你一个指向内部缓冲区的指针,当然它也有一个 大小() 可用于与 C 函数交互的成员函数。从 C++11 开始,还有 data(),它看起来比 &v[0] 更好。

#include <iostream>
#include <initializer_list>
#include <vector>

void print_errors_old_function(int argument_count,int* pErrors)
{
for (int i=0;i<argument_count;++i) { std::cerr << "Error" << pErrors[i] << " "; }
}

void print_errors(std::initializer_list<int> errors)
{
std::vector<int> vErrors(errors);
print_errors_old_function(vErrors.size(), &vErrors[0] /* or vErrors.data() in C+11 */ );
}

int main()
{
print_errors({234,253,334});
return 0;
}

注意它是如何摆脱警告的。

关于c++ - 是否有一种安全的方法来迭代 std::unique_ptr<int[]>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35803198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com