Здравствуйте, blackhearted, Вы писали:
B>Здравствуйте, Аноним, Вы писали:
А>>Почему в следующем коде, в строчке помеченной //No error!, не возникает ошибки компиляции? Это сишный артефакт? А>>
B>Ошибка привдения Sample& к const Sample&?
B>Может я чего-то не понимаю, но при чём тут константность метода?
B>В Func1 аргументы совпадают. B>В Func2 — нет.
Вообще как бы, можно изменить состояние класса константным методом... Может быть компилятор устарел?
Здравствуйте, Аноним, Вы писали:
А>Почему в следующем коде, в строчке помеченной //No error!, не возникает ошибки компиляции? Это сишный артефакт?
А что смущает? Что компилятор не проследил "эквивалентность" *this и m_self?
struct A
{
void func() { };
};
struct B
{
A& a;
B(A& a) : a(a) { }
void func() const
{
a.func();
}
};
int main()
{
A a;
B b(a);
b.func();
}
Такое тоже смущает?
Re[3]: В С++ за семантику программы отвечает программист, а
Здравствуйте, vpchelko, Вы писали:
V>Вообще как бы, можно изменить состояние класса константным методом... Может быть компилятор устарел?
IMHO, ты как-то не так понимаешь концепцию константности
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: В С++ за семантику программы отвечает программист, а
А теперь посмотрим на ситуацию изнутри s2.Func1: член m_self костантного объекта s1 ссылается на неконстантный объект s2. И почему компилятор должен препятствовать вызову Test(m_self)?
--
Re[4]: В С++ за семантику программы отвечает программист, а
За вычетом некоторых очепяток... Насколько я ферштею, основной пафос в том, что мы модифицируем то, на что указывает постоянный указатель, а не сам указатель, вот такое
return *pReadCount++;
не прокатило бы. ОК все по науке. Остается вопрос, а как в исходном посте компилируется вот это:
Sample() : m_self(*this)
Пробую разжевать, в чем мои непонятки. Если у нас const Sample sample , то this — это const Sample* const, а *this — это, стало быть, const Sample. Так? Как тогда можно инициализировать Sample& m_self через (*this)?
В клиентском коде
const Sample foo;
const Sample& bar = foo;
откомпилируется, а вот
const Sample foo;
Sample& bar = foo;
нет.
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Re[5]: В С++ за семантику программы отвечает программист, а
Здравствуйте, slava_phirsov, Вы писали:
_>Остается вопрос, а как в исходном посте компилируется вот это: _>
_>Sample() : m_self(*this)
_>
В исходном примере именно этой строке ничего не мешает. Наверное, ты неточно выразился.
_>Пробую разжевать, в чем мои непонятки. Если у нас const Sample sample , то this — это const Sample* const, а *this — это, стало быть, const Sample. Так? Как тогда можно инициализировать Sample& m_self через (*this)?
У тебя была инициализация (Sample& sample) через m_self. Если ты все еще про это задаешь вопрос, то смотри:
1) есть this, который у нас Sample const.
2) у это this мы обращаемся к m_self, который у нас (Sample&) const.
Так вот толку от последнего const, нет никакого. (Sample&) const это просто(Sample&).
Re[5]: В С++ за семантику программы отвечает программист, а
Здравствуйте, slava_phirsov, Вы писали:
_>ОК все по науке. Остается вопрос, а как в исходном посте компилируется вот это:
_>
_>Sample() : m_self(*this)
_>
_>Пробую разжевать, в чем мои непонятки. Если у нас const Sample sample , то this — это const Sample* const, а *this — это, стало быть, const Sample. Так? Как тогда можно инициализировать Sample& m_self через (*this)?
В коде конструктора this не является указателем на константу. Конструктор же нельзя перегрузить по константности создаваемого объекта...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: В С++ за семантику программы отвечает программист, а
Здравствуйте, Erop, Вы писали:
E>В коде конструктора this не является указателем на константу. Конструктор же нельзя перегрузить по константности создаваемого объекта...
Кстати, да. Возникает мысль использовать это для какого-нить кулхацкерского финта ушами. Отбрасывание константности без использования mutable полей или const_cast<>
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Re[6]: В С++ за семантику программы отвечает программист, а
Здравствуйте, ilvi, Вы писали:
I>В исходном примере именно этой строке ничего не мешает. Наверное, ты неточно выразился.
Да нет, я точно выразился. В исходном примере не мешает, просто я слегка подумал, и заметил одну штуку... Впрочем, Erop уже все разъяснил.
I>1) есть this, который у нас Sample const.
Именно, что нет! В конструкторе он еще не const, и, apropos, this — это указатель, т.е. Sample* (см. ответ Erop'а на мой пост)
I>2) у это this мы обращаемся к m_self, который у нас (Sample&) const.
Foo& const — не бывает. Только const Foo& (в отличие от указателей, где может быть const Foo *, Foo const *, Foo * const и даже const Foo * const)
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Re[7]: В С++ за семантику программы отвечает программист, а
Здравствуйте, slava_phirsov, Вы писали:
_>Здравствуйте, Erop, Вы писали:
E>>В коде конструктора this не является указателем на константу. Конструктор же нельзя перегрузить по константности создаваемого объекта...
_>Кстати, да. Возникает мысль использовать это для какого-нить кулхацкерского финта ушами. Отбрасывание константности без использования mutable полей или const_cast<>
mutable и const_cast — средства для снятия константности с уже существующего объекта. А конструктор, даже если это конструктор копии, создает новый объект, и снять константность уже с существующего объекта с его помощью нельзя.
А невозможность специфицировать коструктор как константный или неконстантный — это не упущение и не финт и не что-то еще. Семантика конструктора такова, что пока объект не создан (а время жизни объекта согласно стандарту и здравому смыслу начинается ПОСЛЕ выхода из его конструктора), говорить о его константности или неконстантности бессмысленно.
--
Re[8]: В С++ за семантику программы отвечает программист, а
Здравствуйте, rg45, Вы писали:
R>mutable и const_cast — средства для снятия константности с уже существующего объекта. А конструктор, даже если это конструктор копии, создает новый объект, и снять константность уже с существующего объекта с его помощью нельзя.
Это я понимаю, я немного другое имею в виду.
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Re[7]: В С++ за семантику программы отвечает программист, а
Здравствуйте, slava_phirsov, Вы писали:
_>Кстати, да. Возникает мысль использовать это для какого-нить кулхацкерского финта ушами. Отбрасывание константности без использования mutable полей или const_cast<>
Если константность истинная, то велика вероятность нарваться на UB...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: В С++ за семантику программы отвечает программист, а
Здравствуйте, rg45, Вы писали:
R>mutable и const_cast — средства для снятия константности с уже существующего объекта. А конструктор, даже если это конструктор копии, создает новый объект, и снять константность уже с существующего объекта с его помощью нельзя.
Вот пример, как можно сделать эрзац-mutable
#include <iostream>
using namespace std;
class Foo
{
Foo& _self;
int _n; // Можно было объявить как mutable и не париться, но мы комсомольцы, мы учимся трудности преодолеватьpublic:
Foo(): _self(*this), _n(0) {};
int bar() const {return _self._n++;}
};
int main()
{
{
Foo foo;
cout << foo.bar() << endl;
cout << foo.bar() << endl;
cout << foo.bar() << endl;
}
{
const Foo foo;
cout << foo.bar() << endl;
cout << foo.bar() << endl;
cout << foo.bar() << endl;
}
}
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Re[8]: В С++ за семантику программы отвечает программист, а
Здравствуйте, rg45, Вы писали:
R>А невозможность специфицировать коструктор как константный или неконстантный — это не упущение и не финт и не что-то еще. Семантика конструктора такова, что пока объект не создан (а время жизни объекта согласно стандарту и здравому смыслу начинается ПОСЛЕ выхода из его конструктора), говорить о его константности или неконстантности бессмысленно.
Мое личное мнение — константность методов и объектов — это плод больного воображения. Имеем необоснованное усложнение языка. Существуют ли другие языки программирования с подобной "фичей"?
Re[8]: В С++ за семантику программы отвечает программист, а
Здравствуйте, rg45, Вы писали:
R>А невозможность специфицировать коструктор как константный или неконстантный — это не упущение и не финт и не что-то еще. Семантика конструктора такова, что пока объект не создан (а время жизни объекта согласно стандарту и здравому смыслу начинается ПОСЛЕ выхода из его конструктора), говорить о его константности или неконстантности бессмысленно.
Почему это бессмысленно? Почему мне нельзя узнать внутри конструктора, константу я строю или нет?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, uzhas, Вы писали:
U>Мое личное мнение — константность методов и объектов — это плод больного воображения. Имеем необоснованное усложнение языка. Существуют ли другие языки программирования с подобной "фичей"?
Ну так не используй... Это же сервис, предоставляемый языком программисту.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском