来自“Working Draft C++,2012-11-02”
21.1 通用 [strings.general]
1 此条款描述了用于操作任何非数组POD(3.9)类型序列的组件。
21.4.1 basic_string通用要求 [string.require]
5 basic_string对象中的char-like对象必须被连续存储。也就是说,对于任何basic_string对象s,当0 <= n < s.size()时,&*(s.begin() + n) == &*s.begin() + n应成立。
但是
6 引用、指针和迭代器引用basic_string序列的元素可能会被以下使用basic_string对象的方式使其无效:
— 作为任何标准库函数的参数,该函数将non-const basic_string作为参数传递给引用。233
— 调用非const成员函数,除了operator[]、at、front、back、begin、rbegin、end和rend。
所以,只要注意在其他地方使用原始数组时不要调用这些函数,就可以安全使用。
更新:
字符特征和要求在21.2字符特征[char.traits]和21.2.1字符特征要求[char.traits.require]中描述。此外,typedef和特化分别在21.2.2 traits typedefs [char.traits.typedefs]和21.2.3 char_traits specializations [char.traits.specializations]中描述。
这些特征也在输入/输出库中使用。因此,有一些要求,例如eof()
或pos_type
和off_type
,在basic_string
的上下文中没有意义。
我没有看到任何对这些特征实际上由实现定义的要求,除了char
、char16_t
、char32_t
和wchar_t
的四个特化。
尽管,在您的示例中,它与gcc 4.7开箱即用,但我定义了一个最小的bool_traits
,只需要
struct bool_traits {
typedef bool char_type;
static void assign(char_type &r, char_type d);
static char_type *copy(char_type *s, const char_type *p, std::size_t n);
static char_type *move(char_type *s, const char_type *p, std::size_t n);
};
我使用了默认提供的实现(gcc 4.7),并将其用作如下:
std::basic_string<bool, bool_traits> ab;
你的环境可能已经提供了一个可用的实现。如果没有,你可以自己实现一个简单的bool_traits
或一个模板特化的std::char_traits<bool>
。
您可以在工作草案,PDF或cppreference.com - std::char_traits中查看字符特性的完整接口。
_Bool
类型和C++的bool
类型具有相同的表示形式吗? - Jonathan Wakelystd::vector<bool>
的特化,并提供一个单独的紧凑数据结构,命名为类似于std::bit_vector
的东西。至少这是我的想法。std::vector<bool>
破坏了很多代码。 - Cornstalks