为什么我不应该使用std :: string.c_str()作为缓冲区?

RT_*_*_34 0 c++ stdstring

虽然这可能是一个愚蠢的问题,但我看到了一些关于你不应该这样做的事情,尽管它在C++ 11中被允许,但我不明白为什么.谁能解释为什么会这样?

Zet*_*eta 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;
Run Code Online (Sandbox Code Playgroud)
  1. 返回:指针p,使得[0,size()]中的每个i的p + i ==&operator.
  2. 复杂性:恒定时间.
  3. 要求:程序不得更改存储在字符数组中的任何值.

除此之外,你用a修改数据引用const char *,通常表示a const_cast<char*>.这不仅会导致未定义的行为,而且根据Herb Sutter的说法,const现在应该被认为是线程安全的(参见他的谈话constmutable).

但是,如上所述,std::string str; &str[0]如果str足够大,使用是安全的.只是不要使用.c_str().data().

  • 只有当a)抛弃const对象的const(而不是const的引用)并且b)用于修改对象时,`const_cast`才会导致未定义的行为.第二部分是真的,第一部分取决于调用`c_str()`的字符串是否为const(即使它是const,也可能是缓冲区仍然不是const ...) .话虽这么说,更好的方法是使用`&str [0]` (2认同)