我一直想知道为什么C++标准库已经使用char类型而不是unsigned char类型实例化了basic_ [io]流及其所有变体.char表示(取决于它是否有符号),您可以对get()等操作进行上溢和下溢,这将导致所涉及变量的实现定义值.另一个例子是当你想使用它的put函数输出一个未格式化的字节到ostream .
有任何想法吗?
注意:我仍然不相信.所以如果你知道明确的答案,你仍然可以发布它.
这个问题是有关,但不完全一样,这个问题.
除了与可读性相关的问题之外,使用std::vector<char>而不是std::string保存任意二进制数据是否有任何好处?
即,与字符串相比,是否有任何使用向量更容易/更有效/更好的任务?
我想编写一个带有提供读取功能的接口的库.C风格的数组容易出错,但允许传递任何大小的缓冲区.C++数组更安全,但强加于大小.
// interface.h
// C-style array
int read (std::uint8_t* buf, size_t len);
// C++ array
int read (std::array<std::uint8_t, 16>& buff)
我怎样才能拥有两全其美?
我在考虑函数模板,但对于库接口来说似乎并不实用.
template <size_t N>
int read (std::array<std::uint8_t, N>& buf);
编辑
std::vector可能是一个很好的候选人,但如果我们考虑char*并且std::array没有动态分配.
编辑我喜欢很多解决方案gsl::span.我坚持使用C++ 14所以没有std::span.我不知道使用第三个库(gsl)是否会成为问题/允许.
编辑我不认为使用char其他类型可能会对答案产生一些影响,所以更清楚的是操作字节.我char改为std::uint8_t
编辑由于C++ 11保证返回std::vector将被移动而不被复制,因此返回std::vector<std::uint8_t>是可以接受的.
std::vector<std::uint8_t> read();