正如其他人所指出的那样,问题在于您无意中添加了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