const是杀死我的C++程序的疾病.这次发生了什么?

Fai*_*per -2 c++

我有一个类似的课程

class HtmlRover
{
public:
    HtmlRover(const std::string::const_iterator &, const std::string::const_iterator &);
    ~HtmlRover();
    // ...
private:
    /...
    std::string::const_iterator _curIter;
    const std::string::const_iterator _offend;
    /...
};
Run Code Online (Sandbox Code Playgroud)

我的编译器抱怨我_offend在构造函数的实现中的实例化:

HtmlRover::HtmlRover(const std::string::const_iterator & it1, const std::string::const_iterator & it2)
{
    _curIter = it1;
    _offend = it2; 
}
Run Code Online (Sandbox Code Playgroud)

它说

No vaiable overload "="
Run Code Online (Sandbox Code Playgroud)

现在我明白这可能与const设置为变量引用的变量有关,但是引用也是const如此,那么问题是什么呢?我知道const变量不能在没有被初始化的情况下存在,但这也不应该是一个问题,因为_offend在初始化HtmlRover对象时正确初始化.

Bat*_*eba 9

由于_offendconst你需要使用一个基地成员初始化器将其值设置:

HtmlRover::HtmlRover(const std::string::const_iterator & it1, const std::string::const_iterator & it2) :
   _offend(it2)
{
    _curIter = it1;     
}
Run Code Online (Sandbox Code Playgroud)

_curIter虽然语言不会坚持这样做,但是对待他们是一个好主意.


Bar*_*rry 5

您必须在初始化列表中初始化const成员:

HtmlRover::HtmlRover(const std::string::const_iterator & it1, 
                     const std::string::const_iterator & it2)
: _curIter(it1) // can be here
, _offend(it2) // must be here
{
}
Run Code Online (Sandbox Code Playgroud)