【问题标题】:Minor (unimportant) defect in the standard?标准中的小(不重要)缺陷?
【发布时间】:2011-03-12 11:52:10
【问题描述】:

这个问题没有与之相关的实际问题,更多的是出于好奇和想知道我是否过于字面意思;)。

所以我一直在努力尽可能多地理解 c++ 标准。今天在研究标准时,我注意到了这一点(ISO/IEC 14882:2003 21.3.4):

const_reference operator[](size_type pos) const;
reference operator[](size_type pos);
Returns: If pos < size(), returns data()[pos].
         Otherwise, if pos == size(), the const version returns charT().
         Otherwise, the behavior is undefined.

对我来说似乎很理智。但后来我想,等一下data()的定义是什么?

const charT* data() const;

是的,它返回一个 const charT*

很明显,operator[] 的非 const 版本不能实现为简单的 return data()[pos],因为那会从 const char 类型的表达式初始化 char&amp; 类型的引用。

我认为很明显意图data()被实现为return data_;operator[]被实现为return data_[pos];或功能相似的东西,但这不是什么标准说:-P。

如果我没记错的话,实施者有一些回旋余地,只要满足给定的基本要求并具有相同的净效果,他们就可以按照自己的意愿实施。

所以问题是,我是否方式过于字面意思,或者这会被视为缺陷的类型。

编辑:值得注意的是,c++0x 草案已将措辞改为:

Returns: If pos < size(), returns *(begin() + pos).
         Otherwise, if pos == size(), the const version returns charT().
         Otherwise, the behavior is undefined.

所以也许我刚刚偶然发现了一些已经讨论过的东西。

【问题讨论】:

  • 我本来打算建议看看新的草案标准,但你领先于我。像这样的小问题并不少见。
  • 标准是人写的,不是神写的:)
  • @Nikolai:当然,我只是好奇这种事情是否会被认为是缺陷,或者我的解释有点过于直白了。

标签: c++ string standards defects


【解决方案1】:

是的,这是一个缺陷,是的,这就是修复。

http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-defects.html#259

【讨论】:

    【解决方案2】:

    我假设他们在定义中使用了data() 而不是data_,因为他们想严格按照公共接口进行定义。

    【讨论】:

    • 当然,但是如果operator[] 的非常量版本被实现为return data()[pos];,它确实不会编译
    • @Evan:不幸的是,他们忘记在发布之前编译标准。
    • @Mike:检测到堆栈溢出:您需要一个符合标准的编译器,这需要一个标准,这需要一个符合标准的编译器,...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 2017-05-07
    相关资源
    最近更新 更多