【发布时间】:2021-08-12 14:59:41
【问题描述】:
一些遗留代码如下所示:
#include <boost/array.hpp>
boost::array<wchar_t, 1000> data;
void func(std::wstring &str)
{
str.assign(data.begin());
}
当我们更新到 C++17 时,我正在更新代码以使用 boost 等效的 boost,我认为 array 是直接替代品,但是当我尝试这个时,我得到一个编译错误:
#include <array>
std::array<wchar_t, 1000> data;
void func(std::wstring &str)
{
str.assign(data.begin());
}
错误 C2664: 'std::basic_string
,std::allocator > &std::basic_string ,std::allocator >::assign(std::initializer_list<_elem>)': 无法将参数 1 从 'std::_Array_iterator<_ty>' 转换为 'std::initializer_list<_elem>' 和 [ _Elem=wchar_t ] 和 [ _Ty=wchar_t ] 和 [ _Elem=wchar_t ]
我们在代码库中的很多地方都使用了这种模式,有什么简单的解决方法吗? boost::array 和 std::array 之间的具体区别是什么导致了这种情况,这是否意味着它不能被视为直接替代品?
(这段代码不是我写的。我不知道为什么我们不只是使用wchar_t[];也许作者只是喜欢boost中的“新”功能。)
【问题讨论】:
-
str.assign(data.begin(), data.end())有效吗?否则,如果您确定data将被空终止,您可能只需要像str.assign(data.data())这样的数组/指针,而不是传递一个迭代器 -
boost::array::begin很可能返回一个指针。这是迭代器的有效实现。坦率地说,作者似乎在滥用实现细节。 -
@CoryKramer 编译确保它工作可能需要更长的时间;)这看起来确实好多了,我想知道 boost 的迭代器有何不同?
标签: c++ boost c++17 visual-c++-2019