私が持っている場合
T& operator[](int i) const;
const T& operator[](int i) const;
別のものの代わりにどのように使用できますか? なぜこれらを定義するのでしょうか?
できないと思います - それらはあいまいです。通常、これが必要です:
T& operator[](int i); // note no trailing const
const T& operator[](int i) const;
オブジェクトが non-const
の場合、最初のオーバーロードが選択されます。これは、2 番目のオーバーロードよりも一致し、2 番目のオーバーロードは、インスタンスの場合に選択されます。最初のオーバーロードはconst
まったく一致しません。
正しいペアはこれです(次のことを意味しているように見えるため、投稿にタイプミスがあると思います):
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[]
a
b[i]
b
operator[]
b[i]
i
b[i] = item; //it must invoke non-const version in order
//to compile and work (properly).
それが役立つことを願っています。