Константность и приведение типа.
От: Кондор Россия  
Дата: 13.01.09 07:39
Оценка: 29 (1)
У меня есть контекстный объект и я хочу, чтоб он мог знать когда кто то пытается его сделать не констаным. Как это реализовать? Такой код почему-то не работает:
class A
{
    operator const A&()
    {
        cout<<"const A()"<<endl;
    }
};
ДДТ!
Re: Константность и приведение типа.
От: Erop Россия  
Дата: 13.01.09 07:57
Оценка:
Здравствуйте, Кондор, Вы писали:

К>
К>class A
К>{
К>    operator const A&()
К>    {
К>        cout<<"const A()"<<endl;
К>    }
К>};
К>


Ну, например, иметь два интерфейса доступа к объекту -- константного и модифицирующего. И контролировать получение второго интерфейса...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Константность и приведение типа.
От: _Dreamer Россия  
Дата: 13.01.09 08:06
Оценка: +1
Здравствуйте, Кондор, Вы писали:

К>У меня есть контекстный объект и я хочу, чтоб он мог знать когда кто то пытается его сделать не констаным. Как это реализовать? Такой код почему-то не работает:


выше уже подсказали решение.
просто представь, что будет в случае указателей ?
A a;
const A * pca = &a;
pca->f(); // const

A * pa = const_cast<A*>(pca); // об этом ты никогда не узнаешь
pa->f(); // non-const
Re[2]: Константность и приведение типа.
От: Кондор Россия  
Дата: 13.01.09 08:16
Оценка:
Здравствуйте, _Dreamer, Вы писали:
Ясно. А что тогда означает оператор, который у меня в классе? В каких случаях он вызывается? Если ни в каких, то почему компилируется?
ДДТ!
Re[3]: Константность и приведение типа.
От: Кодт Россия  
Дата: 13.01.09 10:03
Оценка:
Здравствуйте, Кондор, Вы писали:

К>Ясно. А что тогда означает оператор, который у меня в классе? В каких случаях он вызывается? Если ни в каких, то почему компилируется?


Похоже, дырка в стандарте.
Формально, определять можно любой оператор пользовательского приведения типа.
Но наложение-снятие константности и ссылки (неявное или const/static/c-style-cast) — всегда использует встроенные операторы, поэтому твой оператор просто проигнорируется.
Единственный способ вызвать его — в функциональной форме
#include <iostream>
struct A
{
  operator A const& () { std::cout<<"to-const"<<std::endl; return *this; }
  operator A& () const { std::cout<<"from-const"<<std::endl; return const_cast<A&>(*this); }
};

int main()
{
  A a;
  A& b = a.operator A const&().operator A&();
}

На выходе будет
to-const
from-const
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[3]: Константность и приведение типа.
От: Alexander G Украина  
Дата: 13.01.09 10:08
Оценка:
Здравствуйте, Кондор, Вы писали:

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

К>Ясно. А что тогда означает оператор, который у меня в классе?

Забей. Вот например что означает этот оператор

struct S
{
  operator void(void) const {}
}


Русский военный корабль идёт ко дну!
Re[4]: Константность и приведение типа.
От: Alexander G Украина  
Дата: 13.01.09 10:13
Оценка:
Comeau online кстати хитрый


struct S
{
  operator S const&(){}
  operator void(){}
};




"ComeauTest.c", line 3: warning: "S::operator const S &()" will not be called for
          implicit or explicit conversions
    operator S const&(){}
    ^

"ComeauTest.c", line 4: warning: "S::operator void()" will not be called for
          implicit or explicit conversions
    operator void(){}
    ^

"ComeauTest.c", line 3: warning: missing return statement at end of non-void
          function "S::operator const S &"
    operator S const&(){}
Русский военный корабль идёт ко дну!
Re[5]: Константность и приведение типа.
От: Юрий Жмеренецкий ICQ 380412032
Дата: 13.01.09 12:02
Оценка: 4 (1)
Здравствуйте, Alexander G, Вы писали:

AG>Comeau online кстати хитрый



AG>
AG>struct S
AG>{
AG>  operator S const&(){}
AG>  operator void(){}
AG>};
AG>


12.3.2/1
A conversion function is never used to convert a (possibly cv-qualified) object to the (possibly cv-qualified) same object type (or a reference to
it), ... or to (possibly cv-qualified) void. [103]
...

[103] Even though never directly called to perform a conversion, such conversion functions can be declared and can potentially be
reached through a call to a virtual conversion function in a base class.


Т.е. несмотря что эти функции 'is never used to convert', вызвать явно их можно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.