Нужно ли объявлять константный экземпляр класса со всеми константными атрибутами?

Это продолжение Должен ли класс со всеми константными атрибутами также иметь функцию-член, объявленную константной?.

Итак, у меня есть класс PermutationGroup, все атрибуты которого являются константами. Компилятор по-прежнему делает различие между константным и неконстантным экземпляром:

struct Foo {
  const int bar;
  void meth();
};
int main() {
   Foo foo {2};
   foo.meth();          // correct

   const Foo cfoo {1};
   cfoo.meth();         // wrong
};

Как заметил @nosid в упомянутом вопросе, нельзя вызвать функцию-член, не являющуюся членом const, экземпляром const:

bla.cpp: In function ‘int main()’:
bla.cpp:10:14: error: passing ‘const Foo’ as ‘this’ argument of ‘void Foo::meth()’ discards qualifiers [-fpermissive]
    cfoo.meth();

Итак, вопрос: почему возможно объявить неконстантный экземпляр класса, все атрибуты которого являются константами. Есть ли разумное применение этому?


person hivert    schedule 03.05.2014    source источник
comment
Возможный дубликат stackoverflow.com/questions/23449597/. Пожалуйста, попробуйте решить проблемы по исходному вопросу!   -  person πάντα ῥεῖ    schedule 04.05.2014
comment
@πάντα ῥεῖ: я не хотел менять вопрос в своем исходном сообщении. У меня тоже нет особых проблем. Меня больше интересует хорошая практика.   -  person hivert    schedule 04.05.2014
comment
Было бы полезно понять, почему это важно для вас. Почему бы просто не объявить функции-члены как константы? И почему вы хотите объявить переменные-члены как константы? Это не очень распространено.   -  person nosid    schedule 04.05.2014
comment
@nosid: я моделирую математические объекты. Они не меняются со временем. Например, целое число 1 никогда не станет 2. Другой более содержательный пример: нет никакого смысла изменять наборы всех целых чисел.   -  person hivert    schedule 04.05.2014
comment
@hivert: int также математические объекты, но они изменяемы. ИМО речь идет об идентичности объекта, а не об изменчивости.   -  person nosid    schedule 04.05.2014
comment
@keyser 'Используйте символ @ для проверки связи с пользователями' Да?!? ...   -  person πάντα ῥεῖ    schedule 04.05.2014
comment
@πάντα ῥεῖ: я отредактировал свой комментарий после замечания кейсера.   -  person hivert    schedule 04.05.2014
comment
@nosid: Спасибо за ваши замечания! Я только что понял, что на самом деле я пытался написать одноэлементный шаблон для константного объекта. Мне действительно не нужно объявлять мой атрибут const, даже если это не повредит.   -  person hivert    schedule 04.05.2014
comment
@πάνταῥεῖ Нет, не знал. Вы можете редактировать комментарии :p   -  person keyser    schedule 04.05.2014


Ответы (1)


Что ж, возможное объяснение того, почему должно быть разрешено объявлять не-const экземпляр в классе, все члены которого являются const, заключается просто в том, что вы не можете написать следующий код:

class Foo { Foo(void) const; };

Что повышает:

error: constructors may not be cv-qualified

А это значит, что по крайней мере один член — конструктор и, конечно же, деструктор — всегда будет не-const.

person Rubens    schedule 03.05.2014