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;

うん、それは a を返します。const charT*

明らかに、非 const バージョンの単純なthenoperator[]として実装することはできません。これは、 type の式からtype の参照を初期化するためです。return data()[pos]char&const 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.

ですから、おそらく私は、すでに議論されている何かに出くわしただけです.

4

2 に答える 2

6

はい、それは欠陥であり、はい、これが修正でした。

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

于 2010-07-06T21:17:29.507 に答える
1

彼らは厳密に公開インターフェースの観点から定義したかったので、 data()代わりに定義で使用したと思います。data_

于 2010-07-06T19:29:16.923 に答える