Здравствуйте, Аноним, Вы писали:
А>Почему всплывает exception? Это как то отражено в стандарте?
А>
А>struct A {
А> void f(int aa) { const_cast<int&>(a)=aa;}
А> static const int a;
А>};
А>const int A::a=0;
А>int main() {
А> A a;
А> int b(0);
А> a.f(b);
А>}
А>
В стандарте говорится, что в этом случае будет UB. (ссылку искать лениво)
С точки зрения компилятора: ты объявил константу, компилятор положил ее в
readonly память. А теперь ты пытаешься туда лезть? Что ему делать, если память RO?
С уважением, Александр
Re: Багафича VS8?!!
От:
Аноним
Дата:
08.06.07 10:31
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Почему всплывает exception? Это как то отражено в стандарте?
А>
А>struct A {
А> void f(int aa) { const_cast<int&>(a)=aa;}
А> static const int a;
А>};
А>const int A::a=0;
А>int main() {
А> A a;
А> int b(0);
А> a.f(b);
А>}
А>
Так работает:
struct A {
void f(int aa) { const_cast<int&>(a)=aa;}
static int a;
};
int A::a=0;
int main() {
A a;
int b(0);
a.f(b);
}
странно... может, находится в read-only сегменте данных..
Здравствуйте, Smal, Вы писали:
S>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, Аноним, Вы писали:
А>>>Почему всплывает exception? Это как то отражено в стандарте?
А>>>
А>>>struct A {
А>>> void f(int aa) { const_cast<int&>(a)=aa;}
А>>> static const int a;
А>>>};
А>>>const int A::a=0;
А>>>int main() {
А>>> A a;
А>>> int b(0);
А>>> a.f(b);
А>>>}
А>>>
А>>Так работает: А>>struct A { А>> void f(int aa) { const_cast<int&>(a)=aa;} А>> static int a; А>>}; А>>int A::a=0;
А>>int main() { А>> A a; А>> int b(0); А>> a.f(b); А>>}
А>>странно... может, находится в read-only сегменте данных.. А>>
S>Ничего странного в этом нет.
Здравствуйте, Smal, Вы писали:
S>Здравствуйте, shnyaps, Вы писали:
А>>>>странно... может, находится в read-only сегменте данных.. А>>>>
S>>>Ничего странного в этом нет.
S>>Почему тогда?
S>здесь
Здравствуйте, shnyaps, Вы писали:
S>а можно ссыдку на стандарт?
7.1.5.1/4
Except that any class member declared mutable (7.1.1) can be modified, any attempt to modify a const
object during its lifetime (3.8) results in undefined behavior.
B>7.1.5.1/4
B>Except that any class member declared mutable (7.1.1) can be modified, any attempt to modify a const
B>object during its lifetime (3.8) results in undefined behavior.
B>В 7.1.5.1/5 есть пример.
И как это понимать? Получается любой!!! const_cast — UB
Re[7]: Багафича VS8?!!
От:
Аноним
Дата:
08.06.07 12:33
Оценка:
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, shnyaps, Вы писали:
S>>а можно ссыдку на стандарт?
B>
B>7.1.5.1/4
B>Except that any class member declared mutable (7.1.1) can be modified, any attempt to modify a const
B>object during its lifetime (3.8) results in undefined behavior.
B>В 7.1.5.1/5 есть пример.
Спасибо.
Получается для того, чтобы воспользоваться const_cast ты должен быть уверен в том, что он
ссылается на не константный тип, иначу UB. Я правильно понимаю??
Re: Багафича VS8?!!
От:
Аноним
Дата:
08.06.07 12:43
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Почему всплывает exception? Это как то отражено в стандарте?
А>
А>struct A {
А> void f(int aa) { const_cast<int&>(a)=aa;}
А> static const int a;
А>};
А>const int A::a=0;
А>int main() {
А> A a;
А> int b(0);
А> a.f(b);
А>}
А>
Одного не пойму, зачем нужно присваивать ссылку на переменную размещенную в стеке (aa) статической (a).
Здравствуйте, Аноним, Вы писали:
А>Спасибо. А>Получается для того, чтобы воспользоваться const_cast ты должен быть уверен в том, что он А>ссылается на не константный тип, иначу UB. Я правильно понимаю??
const_cast-ом можно пользоваться всегда, а вот модифицировать объект, ссылка на который получена с помощью const_cast, можно только в том случае, если мы имеем дело с неконстантным объектом.
Здравствуйте, Programador, Вы писали:
P>Здравствуйте, Bell, Вы писали:
B>>
B>>7.1.5.1/4
B>>Except that any class member declared mutable (7.1.1) can be modified, any attempt to modify a const
B>>object during its lifetime (3.8) results in undefined behavior.
B>>В 7.1.5.1/5 есть пример.
P>И как это понимать? Получается любой!!! const_cast — UB
Нет, не любой. К UB ведет снятие константности и модификация "настоящих" констант.
Здравствуйте, Bell, Вы писали:
P>>И как это понимать? Получается любой!!! const_cast — UB B>Нет, не любой. К UB ведет снятие константности и модификация "настоящих" констант.
А "ненастоящие" это только те которые из обычных кастом получены
Здравствуйте, Аноним, Вы писали:
А>сдается мне, что static const для встроенных типов объявленных в классах — костанты времени компиляции.. выводы делаем сами
Да повсякому. Если const int A::a=0; впереди main то времени компиляции, а если позади то рунтайм. Инициализация через функцию переводит в записываемый сегмент