У меня есть контекстный объект и я хочу, чтоб он мог знать когда кто то пытается его сделать не констаным. Как это реализовать? Такой код почему-то не работает:
class A
{
operator const A&()
{
cout<<"const A()"<<endl;
}
};
Здравствуйте, 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', вызвать явно их можно.
Здравствуйте, Кондор, Вы писали:
К>У меня есть контекстный объект и я хочу, чтоб он мог знать когда кто то пытается его сделать не констаным. Как это реализовать? Такой код почему-то не работает:
выше уже подсказали решение.
просто представь, что будет в случае указателей ?
A a;
const A * pca = &a;
pca->f(); // const
A * pa = const_cast<A*>(pca); // об этом ты никогда не узнаешь
pa->f(); // non-const
Ну, например, иметь два интерфейса доступа к объекту -- константного и модифицирующего. И контролировать получение второго интерфейса...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, _Dreamer, Вы писали:
Ясно. А что тогда означает оператор, который у меня в классе? В каких случаях он вызывается? Если ни в каких, то почему компилируется?
Здравствуйте, Кондор, Вы писали:
К>Ясно. А что тогда означает оператор, который у меня в классе? В каких случаях он вызывается? Если ни в каких, то почему компилируется?
Похоже, дырка в стандарте.
Формально, определять можно любой оператор пользовательского приведения типа.
Но наложение-снятие константности и ссылки (неявное или 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&();
}
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&(){}