2012-03-09 93 views
2

我與這些運營商(鑑於某些類型的T)一個structC++:在哪種情況下將使用哪個運算符[]?

T& operator[](size_t i) { return write(i); } 
const T& operator[](size_t i) const { return get(i); } 

當我通過[i]訪問的這一個非const對象,將它總是使用非const operator[]還是會自動看到哪一個是必要的(例如,如果const版本「足夠」)並採取那一個?那裏有什麼規則?大多數編譯器(我主要關心Clang,最近的GCC和最近的MSVC)在那裏的表現都一樣嗎?

背景:write(i)可能比get(i)昂貴得多。我甚至有一些代碼的行爲稍有不同,其中write(i)可能會觸及一些文件,設置一些修改標誌或其他。

回答

4

正如任何成員函數,過載的選擇取決於隱實例參數的類型:

T x; 

x.foo();      // #1 
const_cast<T const &>(x).foo(); // #2 

在情況#1中,隱式實例參數的類型爲T,因此過載T::foo()是可行並將被選中。在情況#2中,隱式實例參數的類型爲T const,因此只有過載T::foo() const是可行的,並且如果它存在將被選中。

正常的重載解析規則在這裏起作用:如果你有const和非const重載並且實例參數是非常量,那麼選擇非常量版本是因爲它需要零轉換,而const過載將需要一次(標準)轉換,即從T &T const &,因此該過載不如非常量適合。

+0

+1根據轉換解釋 – je4d 2012-03-09 23:09:11

3

如果您有一個非const對象,它將始終使用非常量重載。

如果你想手動控制它,使用const_cast ......雖然,如果方法有不同的行爲,你想清楚你在做什麼,它可能會更好調用名爲方法來代替。

相關問題