C ++: автоматический констант? - PullRequest
2 голосов
/ 10 июля 2010

Когда я компилирую этот код:

class DecoratedString
{
private:
    std::string m_String;
public:
     // ... constructs, destructors, etc
     std::string& ToString() const
     {
         return m_String;
     }
}

Я получаю следующую ошибку от g ++: invalid initialization of reference of type 'std::string&" from expression of type 'const std::string'.

Почему m_String рассматривается как const? Разве компилятор не должен просто создать ссылку здесь?

EDIT:

Далее, что я должен сделать, чтобы эта функция действовала как преобразование в строку, которая будет работать в большинстве случаев? Я сделал функцию const, поскольку она не изменяет внутреннюю строку. .. возможно, мне просто нужно заставить его вернуть копию ...

РЕДАКТИРОВАТЬ: Хорошо ... заставить его вернуть работоспособную копию.

Ответы [ 4 ]

9 голосов
/ 10 июля 2010

m_String обрабатывается как const, потому что к нему обращаются как

this->m_String

, а this является const, потому что функция-член ToString() является константной.

3 голосов
/ 10 июля 2010

m_String равен const на тот момент, потому что вы решили объявить метод как const (что, конечно, также делает все члены экземпляра данных константными) - если вам нужночтобы обойти это для этого конкретного члена данных, вы можете явно указать mutable.

1 голос
/ 10 июля 2010

Поскольку вы получаете доступ к m_String через константу this (метод const).

1 голос
/ 10 июля 2010

Поскольку метод является постоянным (const в std::string& ToString() const).Const метод видит this как const объект, а его члены также const объекты.

...