0

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

4

1 回答 1

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

除此之外,您正在通过 a 修改数据引用const char *,这通常表示 a const_cast<char*>。这不仅会导致未定义的行为,而且根据 Herb Sutter 的说法,const现在应该被理解为线程安全的(参见他关于constandmutable的讨论)。

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

于 2013-02-21T22:45:13.567 回答