Багафича VS8?!!
От: Аноним  
Дата: 08.06.07 10:09
Оценка: :)
Почему всплывает 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);
}
Re: Багафича VS8?!!
От: Smal Россия  
Дата: 08.06.07 10:29
Оценка: +3
Здравствуйте, Аноним, Вы писали:

А>Почему всплывает 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 сегменте данных..
Re[2]: Багафича VS8?!!
От: Smal Россия  
Дата: 08.06.07 10:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>>Почему всплывает 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 сегменте данных..

А>

Ничего странного в этом нет.
С уважением, Александр
Re[3]: Багафича VS8?!!
От: shnyaps  
Дата: 08.06.07 10:38
Оценка:
Здравствуйте, 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>Ничего странного в этом нет.


Почему тогда?
Re[4]: Багафича VS8?!!
От: Smal Россия  
Дата: 08.06.07 10:40
Оценка:
Здравствуйте, shnyaps, Вы писали:

А>>>странно... может, находится в read-only сегменте данных..

А>>>

S>>Ничего странного в этом нет.


S>Почему тогда?


здесь
Автор: Smal
Дата: 08.06.07
С уважением, Александр
Re[5]: Багафича VS8?!!
От: shnyaps  
Дата: 08.06.07 10:49
Оценка:
Здравствуйте, Smal, Вы писали:

S>Здравствуйте, shnyaps, Вы писали:


А>>>>странно... может, находится в read-only сегменте данных..

А>>>>

S>>>Ничего странного в этом нет.


S>>Почему тогда?


S>здесь
Автор: Smal
Дата: 08.06.07


а можно ссыдку на стандарт?
Re: Багафича VS8?!!
От: Аноним  
Дата: 08.06.07 11:39
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>Почему всплывает 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);
А>}
А>


Подтверждение не найдено значит все же багафича или пятницо ( здесь
Автор: Smal
Дата: 08.06.07
)
Re: Багафича VS8?!!
От: Programador  
Дата: 08.06.07 12:02
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>Почему всплывает exception? Это как то отражено в стандарте?


Всплывает, но лечится легко
#include <math.h>
const int A::a=sin(0.);
Re[6]: Багафича VS8?!!
От: Bell Россия  
Дата: 08.06.07 12:07
Оценка: 2 (2)
Здравствуйте, 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.


В 7.1.5.1/5 есть пример.
Любите книгу — источник знаний (с) М.Горький
Re[7]: Багафича VS8?!!
От: Programador  
Дата: 08.06.07 12:31
Оценка:
Здравствуйте, 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 есть пример.


И как это понимать? Получается любой!!! 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).
Re: Багафича VS8?!!
От: Аноним  
Дата: 08.06.07 12:46
Оценка: -1
Здравствуйте, Аноним, Вы писали:
А>
А>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);
А>}
А>


сдается мне, что static const для встроенных типов объявленных в классах — костанты времени компиляции.. выводы делаем сами
Re[8]: Багафича VS8?!!
От: Bell Россия  
Дата: 08.06.07 12:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Спасибо.

А>Получается для того, чтобы воспользоваться const_cast ты должен быть уверен в том, что он
А>ссылается на не константный тип, иначу UB. Я правильно понимаю??

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

void f(const SomeType& obj)
{
   const_cast<SomeType&>(obj).mem = 0;
}

...

const SomeType c_obj;
SomeType obj;

f(obj);//Ok
f(c_obj);//UB
Любите книгу — источник знаний (с) М.Горький
Re[8]: Багафича VS8?!!
От: Bell Россия  
Дата: 08.06.07 12:51
Оценка:
Здравствуйте, 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 ведет снятие константности и модификация "настоящих" констант.
Любите книгу — источник знаний (с) М.Горький
Re[9]: Багафича VS8?!!
От: Programador  
Дата: 08.06.07 13:02
Оценка:
Здравствуйте, Bell, Вы писали:

P>>И как это понимать? Получается любой!!! const_cast — UB

B>Нет, не любой. К UB ведет снятие константности и модификация "настоящих" констант.
А "ненастоящие" это только те которые из обычных кастом получены
Re[2]: Багафича VS8?!!
От: Programador  
Дата: 08.06.07 13:20
Оценка: :))
Здравствуйте, Аноним, Вы писали:

А>сдается мне, что static const для встроенных типов объявленных в классах — костанты времени компиляции.. выводы делаем сами

Да повсякому. Если const int A::a=0; впереди main то времени компиляции, а если позади то рунтайм. Инициализация через функцию переводит в записываемый сегмент
Re: to Programador etc.
От: Константин Л.  
Дата: 08.06.07 14:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Почему всплывает 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);
А>}
А>


Как правильно заметил Smal, это UB. И нечего разводить теорий
Re[10]: Багафича VS8?!!
От: Аноним  
Дата: 09.06.07 05:53
Оценка:
Здравствуйте, Programador, Вы писали:

P>А "ненастоящие" это только те которые из обычных кастом получены


Нет. В основной массе это переданные через константную ссылку.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.