来自“C++ 工作草案,2012-11-02”
21.1 一般 [strings.general]
1 本条款描述了用于操作任何非数组 POD (3.9) 类型的序列的组件。
21.4.1 basic_string 一般要求 [string.require]
5 basic_string 对象中的类字符对象应连续存储。也就是说,对于任何 basic_string 对象 s,标识 &*(s.begin() + n) == &*s.begin() + n 应适用于所有 n 值,使得 0 <= n < s.size ()。
但
6 引用 basic_string 序列元素的引用、指针和迭代器可能会因该 basic_string 对象的以下用途而失效:
— 作为任何标准库函数的参数,将对非 const basic_string 的引用作为参数.233
—调用非 const 成员函数,除了 operator[]、at、front、back、begin、rbegin、end 和 rend。
因此,只要您注意,不要在其他地方使用原始数组时调用这些函数,就应该是安全的。
更新:
性格特征和要求在21.2 性格特征 [char.traits]和21.2.1 性格特征要求 [char.traits.require]中描述。此外,typedefs 和 specializations 分别在21.2.2 traits typedefs [char.traits.typedefs]和21.2.3 char_traits specializations [char.traits.specializations]中描述。
这些特征也用于输入/输出库。所以有些要求,比如eof()
orpos_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中查看角色特征的完整界面。