Просветите неуча..
в первый раз вижу в исходниках..
что такое не знаю..
и вообще кроме как 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 есть гораздо более страшные глюки, чем хреновое состояние дел с константностью в шаблонах .
-- Пользователи не приняли программу. Всех пришлось уничтожить. --