正如其他人所指出的那樣,問題在於您無意中添加了const
。
但是,更重要的是你給出的例子,來自「 Effective C++ 」教壞事™。
,它與涉及的問題是沒有問題的,並將該溶液,表達在const
方法方面的非const
方法,通過石膏,是所厭惡的。
與此同時,沒有處理真正的問題(例如調試的簡易性,檢查參數值,在使用前爲了可讀性而定義)。
這裏有更好的和更短的代碼:
using Index = ptrdiff_t;
class TextBlock
{
private:
std::string text;
public:
auto operator[](Index const i) const
-> char const&
{ return text[i]; }
auto operator[](Index const i)
-> char&
{ return text[i]; }
};
對於您沒有,您可以使用此機器支持方便的already- const
-paired底層表示的情況下:
template< class A, class B >
struct With_const_as_T_ { using T = typename std::remove_const<B>::type; };
template< class A, class B >
struct With_const_as_T_< A const, B > { using T = B const; };
template< class A, class B >
using With_const_as_ = typename With_const_as_T_<A, B>::T;
&hellip;發表在模板功能方面都非const
和const
,像這樣:
class TextBlock
{
private:
std::string text;
template< class Self >
static auto at(Self& self, Index const i)
-> With_const_as_<Self, char>&
{ return self.text[i]; }
public:
auto operator[](Index const i) const
-> char const&
{ return at(*this, i); }
auto operator[](Index const i)
-> char&
{ return at(*this, i); } // Look, no casts!
};
是不是也不好的做法,在'string'返回一個字符的參考?似乎堆腐敗等待發生 – tenfour
@tenfour不是什麼'std :: string :: operator []'做什麼? –
謝謝,它的工作很好。 – Anton