2

一些遗留代码如下所示:

#include <boost/array.hpp>

boost::array<wchar_t, 1000> data;

void func(std::wstring &str)
{
 str.assign(data.begin());
}

我正在更新代码以使用我们更新到 C++17 的std等效boost项,我认为array这是一个直接替换,但是当我尝试这个时,我得到一个编译错误:

#include <array>

std::array<wchar_t, 1000> data;

void func(std::wstring &str)
{
 str.assign(data.begin());
}

错误 C2664: 'std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> ::assign(std::initializer_list<_Elem>)':无法使用 [ _Elem=wchar_t ] 和 [ _Ty= 将参数 1 从 'std::_Array_iterator<_Ty,2001>' 转换为 'std::initializer_list<_Elem>' wchar_t ] 和 [ _Elem=wchar_t ]

我们在代码库的很多地方都使用了这种模式,是否有一个简单的修复?两者之间的具体区别是什么boost::arraystd::array导致这种情况的原因是什么,这是否意味着它不能被视为直接替代品?

(这段代码不是我写的。我不知道为什么我们不只是使用wchar_t[];也许作者只是喜欢 boost 中的“新”功能。)

4

1 回答 1

3

boost::array<wchar_t, N>::iterator被定义为wchar_t *

std::array<wchar_t, N>::iterator不需要是wchar_t *.

这就是您的代码无法编译的原因。它假定迭代器是指针。

除此之外,您的代码存在问题,因为str.assign(_pointer_)假定指针指向以空字符结尾的字符串。

然而,好消息是这str.assign(data.begin(), data.end())boost::array两者都有效std::array

但是,如果您在数组中间有一个 NUL,那么您将获得与以前不同的行为。这将为您提供与以前相同的行为:

str.assign(data.begin(), std::find(data.begin(), data.end(), wchar_t(0)))

[后来:嗯,除了data不包含 NUL 的情况。在这种情况下,您之前有未定义的行为,但现在您获得了数组中的所有元素(并且只有那些元素)。]

于 2021-08-12T15:17:12.377 回答