2011-07-18 7 views
2

私はちょうど(5.2.1 [expr.sub]添字)N3291に変更がマークされていること、気づいた:新しいブレース-のinit-リストoperator[]をオーバーロードするためにOKだった、前C++ 0x: "operator []"の "braced-init-list"を禁止する理由は?

を:

struct X { 
    Z operator[](std::initializer_list<int>); 
}; 
X x; 
x[{1,2,3}] = 7; // OK: meaning x.operator[]({1,2,3}) 

今では削除であるとしてを置き換え:ブレース-INIT-リストがあってはならない

組み込みの添え字演算子と共に使用されます。

何が問題でしたか?

+0

'x [{1,2,3}]'を見たときの私の最初の反応は、 "ええ、何?..."でした。たぶんそれが理由です。これは、基本的に、珍しいシンタックスと不明な数の引数を持つ 'operator []'を作成します( 'operator []'が1、2,3、または755のインデックスを取るのは概念的に意味がありますか?そして、ちょうどあなたを困惑させます:P – Damon

+0

いいえ私はそれを見つけました:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3236.html#798 - 彼らはそれを移動しましたそれは奇妙な場所だったので。 – towi

答えて

9

x[{1,2,3}]は組み込みの[]演算子ではありません。ユーザー定義の演算子関数を呼び出します。深呼吸をして、この楽しい構文を使用してください。

+0

きちんと入れてください。私は赤い印が付いたストライクスルーのセクションを見ただけで、そのようなショックを受けました。おそらく実際の言葉を取り入れなかったでしょう。*「組み込み」*。はい、私は*それを使用する*と思います。 1つは、おそらく非常に効率的です(正しくプログラムされていればコピーはありません)。次に、非常に強力な構成が可能になります。 'valarray'はこれを(暗黙的な)クラスですべて行います。この構文は、私にとってはより単純なようです。 – towi

2

いくつか慎重にグーグルがissue 798に私を指摘し、彼らは唯一の13.5.5 [over.sub]にそれを移動し、ないにそれを削除しました。

関連する問題