Re[12]: const в D, требуется помощь клуба.
От: Павел Кузнецов  
Дата: 09.07.05 00:21
Оценка: 1 (1)
VladD2,

> E>

> 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
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[6]: const в D, требуется помощь клуба.
От: Kluev  
Дата: 09.07.05 10:53
Оценка: 1 (1) +1
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:?
Re[7]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 09.07.05 16:28
Оценка:
Здравствуйте, Kluev, Вы писали:

K>А const позволяет все закрыть и грамотно все спроектировать. Конечно щас кое кто возразит что можно заюзать const_cast? но это уже не мои проблеммы. Почему бы сразу не заюзать format c:?


Вот именно. Кто хочет тот добъётся. Так зачем тогда вообще всё это нужно?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[8]: const в D, требуется помощь клуба.
От: pvgoran Россия  
Дата: 09.07.05 17:32
Оценка: +2
Здравствуйте, IT, Вы писали:

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


K>>А const позволяет все закрыть и грамотно все спроектировать. Конечно щас кое кто возразит что можно заюзать const_cast? но это уже не мои проблеммы. Почему бы сразу не заюзать format c:?


IT>Вот именно. Кто хочет тот добъётся. Так зачем тогда вообще всё это нужно?

Как зачем? Чтобы тот, кто не хочет (== не написал const_cast), не мог "добиться" ненужного поведения.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[9]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 09.07.05 18:11
Оценка:
Здравствуйте, pvgoran, Вы писали:

IT>>Вот именно. Кто хочет тот добъётся. Так зачем тогда вообще всё это нужно?

P>Как зачем? Чтобы тот, кто не хочет (== не написал const_cast), не мог "добиться" ненужного поведения.

Но что делать, если они без этого поведения не могут прожить ни дня Как неправильно не хочется, а как правильно нельзя.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 09.07.05 18:57
Оценка: +1
В конце концов выяснилось следующее:

Введены следующие понятия:

есть 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 является вельми полезной вещью.
Re[2]: const в D, требуется помощь клуба.
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 09.07.05 19:22
Оценка:
Здравствуйте, 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++.
Re[10]: const в D, требуется помощь клуба.
От: pvgoran Россия  
Дата: 09.07.05 19:23
Оценка: +3
Здравствуйте, IT, Вы писали:

IT>>>Вот именно. Кто хочет тот добъётся. Так зачем тогда вообще всё это нужно?

P>>Как зачем? Чтобы тот, кто не хочет (== не написал const_cast), не мог "добиться" ненужного поведения.

IT>Но что делать, если они без этого поведения не могут прожить ни дня Как неправильно не хочется, а как правильно нельзя.

Типа, const_cast — это сознательное нарушение const-семантики. (А сознательно, как уже было сказано, можно и format c: сделать.) Важно, чтобы этого нельзя было (или сложно) сделать неосознанно...
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[11]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 09.07.05 21:37
Оценка:
Здравствуйте, pvgoran, Вы писали:

P>Важно, чтобы этого нельзя было (или сложно) сделать неосознанно...


Ну а если мне всё-таки это нужно сделать и сделать осознанно? Ну всякие бывают в жизни случаи
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 10.07.05 07:09
Оценка: 43 (3)
Здравствуйте, 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 — типы ссылок
"только читающий наблюдатель".

Нотация примерно такова:


char a[]; // rw array или slice
char b[#]; // ro array или slice

char a[100]; // static rw array
char b[#] = "Hello Vasya"; // static ro array


Т.е.

char a[] = "Привет"; // ошибка компиляции - cannot cast char[#] to char[]
char b[#] = "Вася"; // все нормально

char c[#] = b[1..3]; // получение слайса, нормально
char d[] = b[1..3]; // ошибка компиляции - cannot cast char[#] to char[]
...


В общем все просто и очевидно как двери.
Реализация всего этого дела проста до примитивности —
статическое расширение таблицы типов. Внешне все просто
и очевидно. В общем — в D стиле.

Если чего не понятно — свистите попробую объяснить.
Re[12]: const в D, требуется помощь клуба.
От: pvgoran Россия  
Дата: 10.07.05 07:25
Оценка:
Здравствуйте, IT, Вы писали:

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


P>>Важно, чтобы этого нельзя было (или сложно) сделать неосознанно...


IT>Ну а если мне всё-таки это нужно сделать и сделать осознанно? Ну всякие бывают в жизни случаи

Вот когда осознанно — тогда и используешь себе спокойно const_cast. Ровно как и format c:.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[13]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 10.07.05 15:56
Оценка:
Здравствуйте, pvgoran, Вы писали:

IT>>Ну а если мне всё-таки это нужно сделать и сделать осознанно? Ну всякие бывают в жизни случаи

P>Вот когда осознанно — тогда и используешь себе спокойно const_cast. Ровно как и format c:.

Т.е. если у меня 30 методов в классе. 15 из них мне не нужно пользовать напрямую, 15 нужно, то мы ставим const, а там где нужно вызываем const_cast? Зашибатый дизайн! Как там Kluev говорил?

А const позволяет все закрыть и грамотно все спроектировать.


Грамотнее уже дальше некуда.
... << RSDN@Home 1.1.4 stable rev. 510>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[14]: const в D, требуется помощь клуба.
От: pvgoran Россия  
Дата: 10.07.05 16:11
Оценка:
Здравствуйте, IT, Вы писали:

IT>>>Ну а если мне всё-таки это нужно сделать и сделать осознанно? Ну всякие бывают в жизни случаи

P>>Вот когда осознанно — тогда и используешь себе спокойно const_cast. Ровно как и format c:.

IT>Т.е. если у меня 30 методов в классе. 15 из них мне не нужно пользовать напрямую, 15 нужно, то мы ставим const, а там где нужно вызываем const_cast? Зашибатый дизайн!

Так... Что-то я не понял, причем здесь const и const_cast. Можно поподробнее?
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[15]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 10.07.05 16:21
Оценка:
Здравствуйте, pvgoran, Вы писали:

IT>>Т.е. если у меня 30 методов в классе. 15 из них мне не нужно пользовать напрямую, 15 нужно, то мы ставим const, а там где нужно вызываем const_cast? Зашибатый дизайн!

P>Так... Что-то я не понял, причем здесь const и const_cast. Можно поподробнее?

Что тут непонятного? Что ты будешь делать, если половину методов в классе тебе нужно разрешить использовать, а вторую половину ты хочешь "грамотно все спроектировать" и закрыть?
... << RSDN@Home 1.1.4 stable rev. 510>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[16]: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 11.07.05 01:22
Оценка:
Здравствуйте, IT, Вы писали:

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


IT>>>Т.е. если у меня 30 методов в классе. 15 из них мне не нужно пользовать напрямую, 15 нужно, то мы ставим const, а там где нужно вызываем const_cast? Зашибатый дизайн!

P>>Так... Что-то я не понял, причем здесь const и const_cast. Можно поподробнее?

IT>Что тут непонятного? Что ты будешь делать, если половину методов в классе тебе нужно разрешить использовать, а вторую половину ты хочешь "грамотно все спроектировать" и закрыть?


Что значит "закрыть"?

Это не про private/protected/public ли?
Re[17]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 11.07.05 01:38
Оценка:
Здравствуйте, c-smile, Вы писали:

IT>>Что тут непонятного? Что ты будешь делать, если половину методов в классе тебе нужно разрешить использовать, а вторую половину ты хочешь "грамотно все спроектировать" и закрыть?


CS>Что значит "закрыть"?

CS>Это не про private/protected/public ли?

Нет, это const. См. выше по топику.
... << RSDN@Home 1.1.4 stable rev. 510>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[18]: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 11.07.05 02:22
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, c-smile, Вы писали:


IT>>>Что тут непонятного? Что ты будешь делать, если половину методов в классе тебе нужно разрешить использовать, а вторую половину ты хочешь "грамотно все спроектировать" и закрыть?


CS>>Что значит "закрыть"?

CS>>Это не про private/protected/public ли?

IT>Нет, это const. См. выше по топику.


Где? Я совсем запутался.

Вот эта твоя фраза:
"Что ты будешь делать, если половину методов в классе тебе нужно разрешить использовать, а вторую половину ты хочешь "грамотно все спроектировать" и закрыть?"

Имеет ответ:
...разрешить использовать — объявить public
...закрыть — объявить private/protected/package

Можешь изложишь еще раз что такое "закрыть"?
Re[19]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 11.07.05 02:26
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Можешь изложишь еще раз что такое "закрыть"?


Re[6]: const в D, требуется помощь клуба.
Автор: Kluev
Дата: 09.07.05
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[20]: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 11.07.05 04:08
Оценка: +1
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, c-smile, Вы писали:


CS>>Можешь изложишь еще раз что такое "закрыть"?


IT>Re[6]: const в D, требуется помощь клуба.
Автор: Kluev
Дата: 09.07.05


Так, ладн, давай я напишу то как я тебя понимаю.

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 тоже
бесполезны — эти атрибуты "снимаются" простым кастом к открытому типу.

Или я неправильно тебя понял?
Re[14]: const в D, требуется помощь клуба.
От: Kluev  
Дата: 11.07.05 06:54
Оценка: +1
Здравствуйте, 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-прохор писать. Или вообще забить на константность. Только это тоже не выход. Забиваем на константноть потребуется писть доку: что можно, а что нельзя. Забиваем на доку — нужен самодокументируемый внятный код. Иными словами троерожный бес — как не кинь всегда рогом вверх.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.