-3

私が持っている場合

T& operator[](int i) const;
const T& operator[](int i) const;

別のものの代わりにどのように使用できますか? なぜこれらを定義するのでしょうか?

4

2 に答える 2

3

できないと思います - それらはあいまいです。通常、これが必要です:

T& operator[](int i); // note no trailing const
const T& operator[](int i) const;

オブジェクトが non-constの場合、最初のオーバーロードが選択されます。これは、2 番目のオーバーロードよりも一致し、2 番目のオーバーロードは、インスタンスの場合に選択されます。最初のオーバーロードはconstまったく一致しません。

于 2013-07-06T12:40:53.873 に答える
1

正しいペアはこれです(次のことを意味しているように見えるため、投稿にタイプミスがあると思います):

T& operator[](int i); //without const;
const T& operator[](int i) const;

あなたの質問については、コードで両方を使用することになる可能性があるため、両方を定義することをお勧めします。これが一例です。

void f(X const &a, X & b)
{
      int i = get_index();
      std::cout << a[i] << std::endl; //this invokes const version
      std::cout << b[i] << std::endl; //this invokes non-const version
}

このコードでは、 は const オブジェクトであるため、a[i]の const-version を呼び出します。つまり、非 const バージョンを呼び出すことはできません。ただし、 の場合、オブジェクトが非 const であり、 の非 const オーバーロードが存在するため、C++ 規則では非 const バージョンを呼び出す必要があると規定されているため、それが優先されます。const 以外のオーバーロードがない場合でも、次のように index にデータを書き込みたい場合など、多くの場合望ましくない const バージョンを呼び出します。operator[]ab[i]boperator[]b[i]i

b[i] = item; //it must invoke non-const version in order 
             //to compile and work (properly).

それが役立つことを願っています。

于 2013-07-06T12:43:17.680 に答える