LINUX.ORG.RU

Что делает модификатор «const class { ... } »?

 


0

2

Вот код:

const class Test
{
public:
	void x()
	{
		a++;
	}
	int a = 1;
};


void main()
{
	Test obj = Test();
	obj.a = 2;   // можно менять член класса
	obj.x();     // можно вызывать метод, меняющий член класса
	cout << obj.a; // 3
}

Если бы я написал:

const Test obj = Test();

было бы понятно - нельзя вызывать неконстантные методы, нельзя менять данные.

Но что делает модификатор, когда он указан в объявлении класса? «const class Test»

На что это влияет?

тоже что и десять точек с запятой после точки с запятой

лиза перелогинся в свой забаненный акк

anonymous
()

Ты можешь написать так:

const class Test
{
...
} test_instance;
Тогда test_instance будет const. А в том виде, как у тебя это бессмысленно.

hippi90 ★★★★★
()
Ответ на: комментарий от deep-purple

Тяжёлое наследие си-стайл синтаксиса.

thunar ★★★★★
()

Сдаётся мне, что ты нам врёшь.

$ g++ -Wall -Wextra -c test.cpp 
test.cpp:1:1: error: ‘const’ can only be specified for objects and functions
    1 | const class A {};
      | ^~~~~
Binkledum
()
Ответ на: комментарий от i-rinat

MSVC такое проглатывает без вопросов

Да он вообще раньше все подряд глотал, сейчас это постепенно фиксят

SR_team ★★★★★
()
Ответ на: комментарий от Binkledum

И разработчики его такие же, потому что изменения касающиеся проглатывания кода могут прийти минорным обновлением в рамках одного тулчейна, что может сломать сборку

SR_team ★★★★★
()
Ответ на: комментарий от Binkledum

Нет, у них просто такое расширение языка — можно main объявить как void. Ну и кто-то когда-то давно начал так в учебных материалах писать, и понеслось.

i-rinat ★★★★★
()
Ответ на: комментарий от deep-purple

Потому что С++, тяжелое детство, деревянные игрушки.

hippi90 ★★★★★
()
Ответ на: комментарий от Binkledum

gcc и clang, кстати, тоже позволяют такое (с ворнингами), но только для сей, для крестов шлют лесом.

В MSVC это тоже предупреждение:

warning C4326: return type of 'main' should be 'int' instead of 'void'
fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

В MSVC это тоже предупреждение

Ты зачем-то умолчал, что для этого сначала нужно выключить расширения языка, которые в MSVC по умолчанию включены. Без этого компилятор будет молчать, даже если запросить /Wall.

i-rinat ★★★★★
()
Ответ на: комментарий от anonymous

Оно и сейчас есть, просто с двумя подчеркиваниями перед словом

anonymous
()
Ответ на: комментарий от LamerOk

Декабарьское обновление тулчейна v142, в котором наконец поправили скоуп инклюдов, и в добавок запретили преписывать имя класса к методам, при объявлении их внутри класса.

Пример для классов - так больше нельзя, но у нас в трид-пати было:

class Foo{
    void Foo::bar();
};

Теперь только так:

class Foo{
    void bar();
};

С инклюдами не знаю как привести пример, но иногда заинклюженый хидер в одном месте был доступен и в других, где он не должен быть доступен, теперь это исправлено, и это сломало у нас все тот же трид-пати, в котором и с классами была проблема

SR_team ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.