Просветите неуча..
в первый раз вижу в исходниках..
что такое не знаю..
и вообще кроме как gcc что-нибудь это понимает?
а может это и не ключевое слово вообще, а в какой нибудь либе определяется?
man не помогает..
Здравствуйте, vvaizh, Вы писали:
V>Просветите неуча.. V>в первый раз вижу в исходниках.. V>что такое не знаю.. V>и вообще кроме как gcc что-нибудь это понимает? V>а может это и не ключевое слово вообще, а в какой нибудь либе определяется? V>man не помогает..
struct A
{
int n1;
mutable int n2;
};
...
const A a;
a.n1 = 2;//ошибка
a.n2 = 2;// все ок
это ключевое слово. давно понимаемое компиляторами. означает что член, объявленный с наличием mutable можно будет менять для константного полного объекта.
class A{
public:
mutable int i;
};
void g()
{
const A a;
a.i = 10;//без mutable ты бы так не мог
}
Здравствуйте, vvaizh, Вы писали:
V>Просветите неуча.. V>в первый раз вижу в исходниках.. V>что такое не знаю.. V>и вообще кроме как gcc что-нибудь это понимает? V>а может это и не ключевое слово вообще, а в какой нибудь либе определяется? V>man не помогает..
mutable — значит "не const ни при каких обстоятельствах"
Т.е. если есть такое объявление:
То такой код компилироваться не будет. Т.к. функция Lock и Unlock изменяют объект this, а он передан в функцию SomeFunct как const.
А если определить переменную m_bLock как mutable, то все будет ништяк.
class CSomeResource
{
mutable bool m_bLock;
public:
Lock(){ m_bLock = true; }
Unlock(){ m_bLock = false; }
void Read( LPCTSTR szBuffer, DWORD dwSize );
};
Компилятор в этом случае похоже не следит за изменениями в переменной m_bLock, если весь объект this константный.
Заранее прошу прощения, если в чем-то здесь ошибся, но вроде как правильно.
Здравствуйте, Amor, Вы писали:
A>То такой код компилироваться не будет. Т.к. функция Lock и Unlock изменяют объект this, а он передан в функцию SomeFunct как const.
Он не будет компилироваться (не должен, по крайней мере) потому что Lock, Unlock не константные методы.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, Amor, Вы писали:
A>То такой код компилироваться не будет. Т.к. функция Lock и Unlock изменяют объект this, а он передан в функцию SomeFunct как const.
КД>Он не будет компилироваться (не должен, по крайней мере) потому что Lock, Unlock не константные методы.
Т.е. не получится вызвать неконстантную функцию, но которая не изменяет объект? Т.е. это будет компилироваться?
class A
{
int a;
public:
int meth(){ return a; }
}
void some( const A& a )
{
int b = a.meth();
}
Здравствуйте, Amor, Вы писали:
КД>Он не будет компилироваться (не должен, по крайней мере) потому что Lock, Unlock не константные методы.
A>Т.е. не получится вызвать неконстантную функцию, но которая не изменяет объект? Т.е. это будет компилироваться? A>помоему это не так.
Это ты компилятору скажи. BCB3 выдал warning.
PS. какой-то песец с раскраской сообщений
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Интересно. До сих пор я, по-простоте душевной, думал, что mutable связана с константными методами.
C++ Standard, 7.1.1/9
The mutable specifier on a class data member nullifies a const specifier applied to the containing class object and permits modification of the mutable class member even though the rest of the object is const. (7.1.5.1).
И так просто, вдобавок:
C++ Standard, 7.1.1/8
The mutable specifier can be applied only to names of class data members (9.2) and cannot be applied to names declared const or static, and cannot be applied to reference members. [Example:
class X {
mutable const int* p; // OKmutable int* const q; // ill-formed
};
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, Amor, Вы писали:
КД>Он не будет компилироваться (не должен, по крайней мере) потому что Lock, Unlock не константные методы.
A>Т.е. не получится вызвать неконстантную функцию, но которая не изменяет объект? Т.е. это будет компилироваться? A>помоему это не так.
КД>Это ты компилятору скажи. BCB3 выдал warning.
КД>PS. какой-то песец с раскраской сообщений
КД>Он не будет компилироваться (не должен, по крайней мере) потому что Lock, Unlock не константные методы.
A>Т.е. не получится вызвать неконстантную функцию, но которая не изменяет объект? Т.е. это будет компилироваться?
...
A>помоему это не так.
Это не будет компилироваться, т.к. ты, не объявив метод константным, как бы сказал, что он может менять объект. А раз так, то его (метод) уже нельзя вызвать для константного объекта. И что там внутри делается, компилятора тогда уже не интересует... Я и не представляю, как можно было иначе организивать.
Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Это ты компилятору скажи. BCB3 выдал warning.
ДН>BCB3 совсем не авторитет, а даже наоборот...
Да ладно
Хоть он и 98 года, но mutable понимает
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Это ты компилятору скажи. BCB3 выдал warning.
ДН>BCB3 совсем не авторитет, а даже наоборот...
КД>Да ладно КД>Хоть он и 98 года, но mutable понимает
В этом вопросе — точно не авторитет. Билдер очень попустительски относится к изменению констант. И у него плохо обстоят дела с константностью в шаблонах.
ММ>class X {
ММ>mutable const int* p; // OK
ММ>mutable int* const q; // ill-formed
ММ>};
—end example][/q]
В связи с этим хотелось бы особо отметить важный момент: в отличие от const, mutable не является частью типа, и положение слова mutable — перед объявлением (т. е. нельзя написать: const int* mutable p;).
Здравствуйте, Анoним, Вы писали:
КД>Хоть он и 98 года, но mutable понимает А>В этом вопросе — точно не авторитет. Билдер очень попустительски относится к изменению констант. И у него плохо обстоят дела с константностью в шаблонах.
В смысле? Просветите на примере
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Хоть он и 98 года, но mutable понимает А>В этом вопросе — точно не авторитет. Билдер очень попустительски относится к изменению констант. И у него плохо обстоят дела с константностью в шаблонах. КД>В смысле? Просветите на примере
Увы, с примером будет туго. Я на нем уже больше года не пишу — сменил место работы. Но проблему помню.
Здравствуйте, Анoним, Вы писали:
А>Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Хоть он и 98 года, но mutable понимает А>В этом вопросе — точно не авторитет. Билдер очень попустительски относится к изменению констант. И у него плохо обстоят дела с константностью в шаблонах. КД>В смысле? Просветите на примере
А>Увы, с примером будет туго. Я на нем уже больше года не пишу — сменил место работы. Но проблему помню.
Ну тогда бы и не мутил воду . У BCB3 есть гораздо более страшные глюки, чем хреновое состояние дел с константностью в шаблонах .
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Ну тогда бы и не мутил воду . У BCB3 есть гораздо более страшные глюки, чем хреновое состояние дел с константностью в шаблонах .
Гм, а что ее мутить? Она и без меня несвежа-с. Даже в пятой версии.
Здравствуйте, Анoним, Вы писали:
А>Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Ну тогда бы и не мутил воду . У BCB3 есть гораздо более страшные глюки, чем хреновое состояние дел с константностью в шаблонах .
А>Гм, а что ее мутить? Она и без меня несвежа-с. Даже в пятой версии.
Так, Аноним, срочно регистрируйся и пойдем в средства разработки.
Будем знаниями о багах BCB обмениваться
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Так, Аноним, срочно регистрируйся и пойдем в средства разработки. КД>Будем знаниями о багах BCB обмениваться
Нетушки. Я же сказал — я уже год с лишком не пишу на нем. Остались только впечатления и обрывочные воспоминания.
Здравствуйте, vvaizh, Вы писали:
V>Просветите неуча.. V>в первый раз вижу в исходниках.. V>что такое не знаю.. V>и вообще кроме как gcc что-нибудь это понимает? V>а может это и не ключевое слово вообще, а в какой нибудь либе определяется? V>man не помогает..
Насколько я понимаю mutable — сделано для того, чтобы менять СНАРУЖИ класса, то, что внутри поменять нельзя. Например, readoonly порт под досом — яркий пример mutable для твоего класса.
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Здравствуйте, Анoним, Вы писали:
А>Гм, а что ее мутить? Она и без меня несвежа-с. Даже в пятой версии.
И в шестой тоже. Короче дурной компилятор... А какие у него глюки с шаблонами....
... << RSDN@Home 1.0 beta 5 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Анoним, Вы писали:
А>Frostbitter, с чем вы несогласны опять? Или это у вас несогласительная болезнь?
А прикольненький у вас ник. Все подумали (и я, и, очевидно, Коваленко Дмитрий тоже), что вы <Аноним>, а вы оказывается Аноним. И класно вы меня занулили, прям ковбой!
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Анoним, Вы писали:
А>Гм, а что ее мутить? Она и без меня несвежа-с. Даже в пятой версии. WH>И в шестой тоже. Короче дурной компилятор... А какие у него глюки с шаблонами....
Ну все, запозорили, блин.
Для того что бы хоть как-то показать обратное, могу сказать что моя игрушка компилируется на Free Borland C++ Compiler. ~50% функционального кода — построена на шаблонах. В том числе — полностью весь механизм управления временными файлами (типа — кэш, менеджер страниц, менеджер блоков в файле и т.д.). Шаблоны очень даже не тривиальные. Скажем в некоторых местах — просто бешенные . И все работает как швецарские часы
Проблемы, конечно, были. Именно необъяснимые глюки компилятора. Но думаю, что поставить на колени можно любой компилятор C++. Вопрос только времени и практики.
Вы мне еще скажите что у VC реализован нормальный компилятор
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Вы мне еще скажите что у VC реализован нормальный компилятор
Речь шла не о сравнении. Речь шла о том, что BC++ содержит гадости и не является авторитетом.
Гадости VC++ и BC++ трудно сравнивать в ключе лучше/хуже-больше/меньше. Они просто разные.
Жаль, что нужно тратить время, чтобы "ставить их на колени". Причем на каждый компилятор.
Здравствуйте, Denn, Вы писали:
D>Здравствуйте, Amor, Вы писали:
A>mutable — значит "не const ни при каких обстоятельствах"
D> А что же тогда значит volatile???
Из Страуструпа:
Volatile — это подсказка компилятору, что объект может изменять свое значение не описанным в языке образом, так что агрессивной оптимизации следует избегать