标准中的次要(不重要)缺陷?

8
这个问题没有实际问题,更多的是好奇和想知道是否我过于字面理解。所以我一直在努力理解尽可能多的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;

是的,它返回一个constcharT*
显然,operator[]的非常量版本不能被实现为简单的return data()[pos],因为那样会从类型为const char的表达式初始化一个类型为char&的引用。
我认为,明显的意图是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.

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

我本来想建议看一下新的草案标准,但是你比我更先进。这样的小问题很常见。 - Mark Ransom
3
标准是由人而非神所撰写的 :) - Nikolai Fetissov
@Nikolai:当然,我只是好奇这是否被认为是一个缺陷,或者我在解释上有点太过字面了。 - Evan Teran
2个回答

6

1

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


1
当然可以,但是如果非const版本的operator[]被实现为return data()[pos];,它实际上无法编译 - Evan Teran
1
@Evan:很遗憾,在发布标准之前,他们忘记编译了它。 - Mike Seymour
@Mike:检测到 Stack Overflow 错误:你需要一个符合标准的编译器,而这需要一个标准,而这又需要一个符合标准的编译器,以此类推... - MSalters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接