虽然这可能是一个愚蠢的问题,但我看到了一些关于你不应该这样做的东西,尽管事实上它在 C++ 11 中是允许的,但我不太明白为什么。谁能解释为什么会这样?
这是
不允许的!
21.4.7 basic_string字符串操作[string.ops]
21.4.7.1 basic_string 访问器[字符串.访问器]
const charT* c_str() const noexcept; const charT* data() const noexcept;
- 返回:一个指针 p,使得 p + i == &运算符对于 [0,size((] 中的每个 i。
- 复杂度:恒定时间。
- 要求:程序不得更改字符数组中存储的任何值。
除此之外,您正在通过const char *
修改数据引用,这通常表示const_cast<char*>
。这不仅会导致未定义的行为,而且根据 Herb Sutter 的说法const
现在应该被解读为线程安全的(参见他关于const
和mutable
的谈话(。
但是,如前所述,如果str
足够大,则使用std::string str; &str[0]
是安全的。只是不要使用.c_str()
或.data()
.