> E>The top-level cv-qualifiers of the lvalue expression or the type-id that is the operand of typeid are always ignored. [Example:
> E>
> > E>
> E>A type mentioned in 3.9.1 and 3.9.2 is a cv-unqualified type. Each type which is a cv-unqualified complete or incomplete object type or is void (3.9) has three corresponding cv-qualified versions of its type: <...>
> E>
> > Ну, тоесть стандарт противоречит сам себе? Или это все же не тип в полном понимании этого слова?
Не противоречит. Это такое специальное правило: для нескольких различных, но некоторым образом связанных, типов объект type_info хранится общий на всех. Также точно можно было бы внести в спецификацию требование идентичности результата typeid для всех типов, начинающихся с одной и той же буквы. И, хотя в последнем шаге никакого смысла нет, от этого эти типы одним типом бы не стали. Соответственно, CV-квалифицированные версии некоторого типа являются вполне различимыми типами в полном понимании этого слова, но для них введены некоторые специальные правила (идентичность типов с точки зрения typeid — из них далеко не единственное).
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
VD>В С# доступна инкапсуляция которая позволяет создать immutability-объекты. Отальное от лукавого. VD>Главное, что этого достаточно для создания immutability-классов решающих поставленную проблему.
Нифига это не решает проблеммы.
Вот пример на С++ из реальной жизни
struct KnotVector
{
double knot_at( int idx ) const;
void resize( int p, int n );
};
struct PointVector
{
const HPoint& point_at( int idx ) const;
void resize( int n );
};
// а теперь внимание сюда:class NurbsCurve
{
KnotVector m_U;
PointVector m_Pw;
public:
const KnotVector& U() const { return m_U; }
const PointVector& Pw() const { return m_Pw; }
// вот здесь:void resize( int p, int n )
{
m_U.resize(p,n);
m_Pw.resize(n);
}
};
Классы KnotVector и PointVector могут юзатся пользователем сами по себе или как агреггаты в других классах NurbsCurve, NurbsSurface и т.п. Причем когда они юзаются как часть агрегата естественно что модификация возможна только классом владельцем.
Если бы не было const то пришлось бы копировать read-only интерфейс KnotVector и PointVector в каждый из классов:
class NurbsSurface
{
KnotVector m_U, m_V;
public:
double u_knot_at(int idx);
double v_knot_at(int idx);
// и еще тридцать методов
};
А const позволяет все закрыть и грамотно все спроектировать. Конечно щас кое кто возразит что можно заюзать const_cast? но это уже не мои проблеммы. Почему бы сразу не заюзать format c:?
Здравствуйте, Kluev, Вы писали:
K>А const позволяет все закрыть и грамотно все спроектировать. Конечно щас кое кто возразит что можно заюзать const_cast? но это уже не мои проблеммы. Почему бы сразу не заюзать format c:?
Вот именно. Кто хочет тот добъётся. Так зачем тогда вообще всё это нужно?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, Kluev, Вы писали:
K>>А const позволяет все закрыть и грамотно все спроектировать. Конечно щас кое кто возразит что можно заюзать const_cast? но это уже не мои проблеммы. Почему бы сразу не заюзать format c:?
IT>Вот именно. Кто хочет тот добъётся. Так зачем тогда вообще всё это нужно?
Как зачем? Чтобы тот, кто не хочет (== не написал const_cast), не мог "добиться" ненужного поведения.
Здравствуйте, pvgoran, Вы писали:
IT>>Вот именно. Кто хочет тот добъётся. Так зачем тогда вообще всё это нужно? P>Как зачем? Чтобы тот, кто не хочет (== не написал const_cast), не мог "добиться" ненужного поведения.
Но что делать, если они без этого поведения не могут прожить ни дня Как неправильно не хочется, а как правильно нельзя.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
есть 1) immutable resource, а есть
2) immutable reference — суть readonly observer.
сторонники ultimate immutability (включая Вальтера)
утверждали (past continious, sic!) следующее:
т.к. в C++ нельзя достичь №1 (что правда) значит это все обман
и профанация поэтому народу не нужны ни №1 ни №2.
Путем неслабого LOLQ ( Loss of life quotient, the amount you post is the equivilent to your
loss of life. Очень понравилась аббревиатура ) похоже удалось договориться что
№2 является вельми полезной вещью.
Здравствуйте, c-smile, Вы писали:
CS>есть 1) immutable resource, а есть CS>2) immutable reference — суть readonly observer.
CS>Путем неслабого LOLQ ( Loss of life quotient, the amount you post is the equivilent to your CS>loss of life. Очень понравилась аббревиатура ) похоже удалось договориться что CS>№2 является вельми полезной вещью.
c-smile, а можно для менее эрудированных читателей описать тоже самое в более доступной форме и на русском?
И с примерами, если не сложно.
... << RSDN@Home 1.1.4 stable rev. 510>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, IT, Вы писали:
IT>>>Вот именно. Кто хочет тот добъётся. Так зачем тогда вообще всё это нужно? P>>Как зачем? Чтобы тот, кто не хочет (== не написал const_cast), не мог "добиться" ненужного поведения.
IT>Но что делать, если они без этого поведения не могут прожить ни дня Как неправильно не хочется, а как правильно нельзя.
Типа, const_cast — это сознательное нарушение const-семантики. (А сознательно, как уже было сказано, можно и format c: сделать.) Важно, чтобы этого нельзя было (или сложно) сделать неосознанно...
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, c-smile, Вы писали:
CS>>есть 1) immutable resource, а есть CS>>2) immutable reference — суть readonly observer.
CS>>Путем неслабого LOLQ ( Loss of life quotient, the amount you post is the equivilent to your CS>>loss of life. Очень понравилась аббревиатура ) похоже удалось договориться что CS>>№2 является вельми полезной вещью.
E>c-smile, а можно для менее эрудированных читателей описать тоже самое в более доступной форме и на русском? E>И с примерами, если не сложно.
Я извиняюсь что получилось как-то уж слишком...
Смысл примерно такой:
В D есть три типа ссылок:
1) array (или slice) ссылка на последовательность элементов, имеет атрибуты ptr — ссылка на первый элемент и length длина в элементах.
2) pointer — обычный pointer на место в памяти — то же самое что и в C/C++
3) object reference — закамуфлированный указатель на объект — то же что и в Java.
Постулируется следующее: Объект(его класс) (если нужно) можно всегда описать таким образом что он будет
"только для чтения" для внеших пользователей.
Т.е. основная проблема и потребность состоит в обеспечентии immutability для arrays и pointers.
Идея предложения состоит в ведении двух новых (и явных в отличии от C++)
типов read-only array (slice) и read-only pointer — типы ссылок
"только читающий наблюдатель".
В общем все просто и очевидно как двери.
Реализация всего этого дела проста до примитивности —
статическое расширение таблицы типов. Внешне все просто
и очевидно. В общем — в D стиле.
Если чего не понятно — свистите попробую объяснить.
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, pvgoran, Вы писали:
P>>Важно, чтобы этого нельзя было (или сложно) сделать неосознанно...
IT>Ну а если мне всё-таки это нужно сделать и сделать осознанно? Ну всякие бывают в жизни случаи
Вот когда осознанно — тогда и используешь себе спокойно const_cast. Ровно как и format c:.
Здравствуйте, pvgoran, Вы писали:
IT>>Ну а если мне всё-таки это нужно сделать и сделать осознанно? Ну всякие бывают в жизни случаи P>Вот когда осознанно — тогда и используешь себе спокойно const_cast. Ровно как и format c:.
Т.е. если у меня 30 методов в классе. 15 из них мне не нужно пользовать напрямую, 15 нужно, то мы ставим const, а там где нужно вызываем const_cast? Зашибатый дизайн! Как там Kluev говорил?
А const позволяет все закрыть и грамотно все спроектировать.
Грамотнее уже дальше некуда.
... << RSDN@Home 1.1.4 stable rev. 510>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>>>Ну а если мне всё-таки это нужно сделать и сделать осознанно? Ну всякие бывают в жизни случаи P>>Вот когда осознанно — тогда и используешь себе спокойно const_cast. Ровно как и format c:.
IT>Т.е. если у меня 30 методов в классе. 15 из них мне не нужно пользовать напрямую, 15 нужно, то мы ставим const, а там где нужно вызываем const_cast? Зашибатый дизайн!
Так... Что-то я не понял, причем здесь const и const_cast. Можно поподробнее?
Здравствуйте, pvgoran, Вы писали:
IT>>Т.е. если у меня 30 методов в классе. 15 из них мне не нужно пользовать напрямую, 15 нужно, то мы ставим const, а там где нужно вызываем const_cast? Зашибатый дизайн! P>Так... Что-то я не понял, причем здесь const и const_cast. Можно поподробнее?
Что тут непонятного? Что ты будешь делать, если половину методов в классе тебе нужно разрешить использовать, а вторую половину ты хочешь "грамотно все спроектировать" и закрыть?
... << RSDN@Home 1.1.4 stable rev. 510>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, pvgoran, Вы писали:
IT>>>Т.е. если у меня 30 методов в классе. 15 из них мне не нужно пользовать напрямую, 15 нужно, то мы ставим const, а там где нужно вызываем const_cast? Зашибатый дизайн! P>>Так... Что-то я не понял, причем здесь const и const_cast. Можно поподробнее?
IT>Что тут непонятного? Что ты будешь делать, если половину методов в классе тебе нужно разрешить использовать, а вторую половину ты хочешь "грамотно все спроектировать" и закрыть?
Здравствуйте, c-smile, Вы писали:
IT>>Что тут непонятного? Что ты будешь делать, если половину методов в классе тебе нужно разрешить использовать, а вторую половину ты хочешь "грамотно все спроектировать" и закрыть?
CS>Что значит "закрыть"? CS>Это не про private/protected/public ли?
Нет, это const. См. выше по топику.
... << RSDN@Home 1.1.4 stable rev. 510>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, c-smile, Вы писали:
IT>>>Что тут непонятного? Что ты будешь делать, если половину методов в классе тебе нужно разрешить использовать, а вторую половину ты хочешь "грамотно все спроектировать" и закрыть?
CS>>Что значит "закрыть"? CS>>Это не про private/protected/public ли?
IT>Нет, это const. См. выше по топику.
Где? Я совсем запутался.
Вот эта твоя фраза:
"Что ты будешь делать, если половину методов в классе тебе нужно разрешить использовать, а вторую половину ты хочешь "грамотно все спроектировать" и закрыть?"
Имеет ответ:
...разрешить использовать — объявить public
...закрыть — объявить private/protected/package
1) Есть абстрактное понятие resource immutability
гипотетическая возможность объявление фрагмента памяти "только для чтения".
2) Есть второе понятие — reference immutability — "через эту ссылку на память её (память) изменить нельзя"
Известно что №1 имплементировать на уровне компилятора практически нельзя —
требуется runtime имплементация на уровне virtual machine. Для C++ виртуальной машиной
явлеяется сам процессор. Т.е. без поддержки процессора №1 имплементирвать нельзя.
На уровне VM (.NET/Java) это сделать можно, но путем еще большей потери эффективности
Как я понял ты утверждаешь следующее :
Если №1 сделать практически нельзя то и №2 никому не нужен.
Я правильно тебя понял?
Дело в том что reference immutability (№2) есть того же поля ягода
что и наличие в языках атрибутов видимости public / private / protected.
const в С++ это просто еще один инструмент на эту тему.
Т.е. если считать что const это не решение, то и public / private / protected тоже
бесполезны — эти атрибуты "снимаются" простым кастом к открытому типу.
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, pvgoran, Вы писали:
IT>>>Ну а если мне всё-таки это нужно сделать и сделать осознанно? Ну всякие бывают в жизни случаи P>>Вот когда осознанно — тогда и используешь себе спокойно const_cast. Ровно как и format c:.
IT>Т.е. если у меня 30 методов в классе. 15 из них мне не нужно пользовать напрямую, 15 нужно, то мы ставим const, а там где нужно вызываем const_cast? Зашибатый дизайн! Как там Kluev говорил?
IT>
А const позволяет все закрыть и грамотно все спроектировать.
IT>Грамотнее уже дальше некуда.
Уважаемый IT я не понимаю на что ты жалуешься? Если ты юзаешь в С++ const_cast это значит что ты изучил классцы и знаешь что делаешь. В С# вася пупкин напишет immutable-proxy и прийдется только через рефлекшн лезть в обход private (еще хуже чем конст_каст). Или самому все переписать и кататся на своих собственных велосипедах. Проблема не в констах а в вася-пупкиных. Только в С++ проще — написал const и спи отдыхай. А в С# прийдется пыхтеть для каждого класса readonly-прохор писать. Или вообще забить на константность. Только это тоже не выход. Забиваем на константноть потребуется писть доку: что можно, а что нельзя. Забиваем на доку — нужен самодокументируемый внятный код. Иными словами троерожный бес — как не кинь всегда рогом вверх.