Для объявления объекта const в C ++ требуется пользовательский конструктор по умолчанию. Если у меня есть изменяемая переменная-член, почему бы и нет? - PullRequest
8 голосов
/ 21 января 2020

В C ++, чтобы объявить объект класса, который имеет переменную-член как const, у нас должен быть определяемый пользователем конструктор по умолчанию. Следующий код иллюстрирует это.

class Some {
    int value;
};

int main() {
    // error: default initialization of an object of const type 'const Some'
    //        without a user-provided default constructor
    const Some some;

    return 0;
}

Однако, если переменная-член, принадлежащая классу, квалифицируется как изменяемая, компилятор не будет сообщать о каких-либо ошибках. Для справки я скомпилировал с помощью команды clang++ -std=c++17 -stdlib=libc++ helloworld.cpp -o helloworld.out --debug. Интересно, этот результат вызван ошибкой в ​​компиляторе или согласно синтаксису, определенному в языке C ++.

class Some {
    mutable int value;
};

int main() {
    const Some some;

    return 0;
}

1 Ответ

2 голосов
/ 22 января 2020

Переписав мой комментарий как ответ, надеюсь, он кому-нибудь поможет.

Нет смысла объявлять объект const, если он не инициализирован в какой-либо форме.
Рассмотрим следующий код:

    const int x;

clang говорит: error: default initialization of an object of const type 'const int'.
г cc сказал бы: error: uninitialized const ‘x’ [-fpermissive]

Логика c в этом заключается в том, что в этом типе нет смысла декларации.
Значение x никогда не может измениться, и поэтому этот код будет непредсказуемым, поскольку x будет отображен в неинициализированную память.
В вашем примере добавление ключевого слова mutable к value означает, что, хотя экземпляр Some является константой, если объявлен как:

    const Some some;

, все еще возможно изменить value в более позднее время.
Например:

    some.value = 8;

Это означает, что можно использовать этот код предсказуемым образом, поскольку value можно установить позже и неинициализированные константы отсутствуют.

...