§21.4.5 [string.access]

const_reference operator[](size_type pos) const;
reference operator[](size_type pos);



第二部分对我来说至少意味着,此“charT类型的对象”可以驻留在std::string对象中存储的序列之外。符合operator[]的示例实现:
reference operator[](size_type pos){
  static contexpr charT default = charT();
  if(pos == size())
    return default;
  return buf[pos];
}

现在,c_str()/data()是根据operator[]来指定的:
§21.4.7 [string.accessors]
const charT* c_str() const noexcept;
const charT* data() const noexcept;



这将使上述operator[]实现不符合p + size() != &operator[](size())。但是,通过一些技巧,您可以解决此问题:
reference operator[](size_type pos){
  static contexpr charT default = charT();
  if(pos == size() && !evil_context) // assume 'volatile bool evil_context;'
    return default;
  return buf[pos];
}

struct evil_context_guard{
  volatile bool& ctx;
  evil_context_guard(volatile bool& b)
    : ctx(b) {}
  ~evil_context_guard(){ b = false; }
};

const charT* c_str() const noexcept{
  evil_context_guard g(evil_context = true);
  // now, during the call to 'c_str()', the requirement above holds
  // 'p + i == &operator[](i) for each i in [0,size()]'
  const charT* p = &buf[0];
  assert(p+size() == &operator[](size()));
  return p;
}

现在,显而易见的问题是...

上面的代码是否真的符合我规定?

最佳答案

忽略给定的代码,仅考虑问题,我认为

  • ,不幸的是,答案似乎是"is",而
  • 当然不是标准的意图。

  • 因此,它似乎是缺陷

    检查list of known library defects显然尚未报告此问题。

    因此,正如我在聊天中所述,建议将其发布到[comp.std.c++],以便解决是否确实是缺陷的问题,如果存在,则将其放入缺陷列表并进行修复。

    07-24 09:46
    查看更多