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